为什么在打字稿中定义函数类型有两种方法呢?

时间:2019-11-03 19:31:43

标签: typescript

两者之间有什么区别?

正在做

A)

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

只需这样做:

B)

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

我是从打字稿documentation中摘录的。为什么片段 A 中的代码有用?我只是在其中看到了一些冗余,就像在代码片段 B 中那样,键入了参数,还键入了返回值。

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

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

2 个答案:

答案 0 :(得分:2)

两个示例之间没有区别。在这两种情况下,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;}

答案 1 :(得分:-1)

基本上,“ A”代码段用于为myAdd函数创建类型。如果您在没有类型的情况下定义myAdd函数,则可以在之后将其重新分配为任何值或数据类型。也许您希望myAdd应该使用两个数字参数并返回一个数字。但是,如果您不分配类型,则可能会不小心将其分配给其他类型。