为什么在typescript中定义函数类型有两种方法?

为什么在typescript中定义函数类型有两种方法?,typescript,Typescript,两者的区别是什么 做: (A) 这样做: (B) 我从打字稿上取的。为什么代码段A中的代码很有用?我只是看到了一些冗余,就像在代码段B中一样,参数是类型化的,返回值也是类型化的 我的印象是,在代码段A中,参数和结果值的输入被执行了两次 我不明白为什么A不同于B,或者为什么A比B更有用。基本上,A代码片段用于为myAdd函数创建类型。如果定义myAdd函数时不使用类型,则可以在以后重新指定给任何值或数据类型。也许您希望myAdd应该采用两个数字参数并返回一个数字。但如果您不指定类型,则可能会意外地

两者的区别是什么

做:

(A)

这样做:

(B)

我从打字稿上取的。为什么代码段A中的代码很有用?我只是看到了一些冗余,就像在代码段B中一样,参数是类型化的,返回值也是类型化的

我的印象是,在代码段A中,参数和结果值的输入被执行了两次


我不明白为什么A不同于B,或者为什么A比B更有用。

基本上,A代码片段用于为myAdd函数创建类型。如果定义myAdd函数时不使用类型,则可以在以后重新指定给任何值或数据类型。也许您希望myAdd应该采用两个数字参数并返回一个数字。但如果您不指定类型,则可能会意外地将其指定给其他类型。

这两个示例之间没有区别。在这两种情况下,
myAdd
具有相同的类型
(x:number,y:number)=>number

文档中的示例只是关于如何编写函数类型。在本例中,指定类型并不有用,但可以使用该类型执行其他操作。您可以将其放入类型别名中并重新使用:

type MyOp = (x: number, y: number) => number;
let myAdd: MyOp = function (x: number, y: number): number { return x + y; };
let mySubtract: MyOp  = function (x: number, y: number): number { return x - y; };
您也无法在声明时初始化函数:

let myOp: (x: number, y: number) => number;
declare let condition: boolean;

if (condition) {
    myOp = function (x: number, y: number): number { return x + y; };
} else {
    myOp = function (x: number, y: number): number { return x - y; };
}

此外,如果有函数类型,则不需要指定参数类型:

let myOp: (x: number, y: number) => number = function (x, y) { return x + y;}

这没有什么区别,因为所推断的类型是完全相同的。确保它符合特定的签名,而不是像本例中这样的内联类型,这通常很有用。如果我尝试使用示例中的两个不同函数为我分配的变量分配不同的类型,我会得到完全相同的错误,例如,如果我尝试分配布尔值:
类型“true”不能分配给类型“number”
。因此,如果我同等地使用代码段A或B中的函数,则会推断返回类型的类型。我想您不理解我的意思。我说的是重新分配函数本身。例如:–
让我添加:(x:number,y:number)=>number;myAdd=true//类型“true”不可分配给类型“(x:number,y:number)=>number”。
哦,你说得对,我还没有理解,但是如果尝试重新分配代码段B中的变量,例如,如果我将绑定分配给布尔值,则会引发相同的错误。关于信息,这是我的Tconfig选项:`“compilerOptions”:{“jsx”:“react”,“esModuleInterop”:true,“lib”:[“es6”,“dom”,“es2017”],“strictNullChecks”:true,“strictFunctionTypes”:true}`使用代码段“A”将为myAdd变量创建一个类型。因此,如果您将其重新指定给其他类型。它将给出一个错误<代码>让myAdd:any=函数(x:number,y:number):number{返回x+y;};myAdd=true//工作正常,因为myAdd的类型是any。使用代码段“B”将使Typescript从指定的值推断类型。在您的例子中,一个函数接受2个数字参数并返回一个数字,如果您将重新指定给其他类型,它将给出一个错误。
let myOp: (x: number, y: number) => number;
declare let condition: boolean;

if (condition) {
    myOp = function (x: number, y: number): number { return x + y; };
} else {
    myOp = function (x: number, y: number): number { return x - y; };
}

let myOp: (x: number, y: number) => number = function (x, y) { return x + y;}