呼叫签名和功能类型之间的区别

时间:2015-08-17 05:43:52

标签: typescript

我试图理解为什么我们为调用签名和函数类型使用不同的语法。请考虑以下代码:

interface MyInterface {
   // This is call signature
   // It is used inside object type, function expression, function declaration, etc...
    (x:number, y:number):number; 
}

var myOne : MyInterface = (x,y) => x + y;
            // vv this is function type
var myTwo : (x:number, y:number)=>number = (x,y) => x + y; 
// function type is used in function type literal

在此代码中,myOnemyTwo变量实际上相同。它们(据我所见)是完全相同的类型,只是定义不同。

现在,当我们使用界面来定义它们时,我们使用调用签名,如下所示:

(x:number, y:number):number

当我们不使用界面时,我们使用函数类型文字

(x:number, y:number)=>number

两者都表达相同的东西,参数的名称和类型以及返回类型的类型。我想知道,为什么我们需要两种不同但又相似的方法在打字稿中写同样的东西?

1 个答案:

答案 0 :(得分:15)

它们完全一样。

  

为什么我们需要两种不同但又相似的方法来在typescript中编写相同的东西

(x:number, y:number)=>number签名可用作property注释:

interface MyInterface {
    (x:number, y:string):string;   
    someProperty: (x:number, y:number)=>number;
}

与您的相似:

var myTwo : (x:number, y:number)=>number

只是详细

的简写
var myTwo : {(x:number, y:number):number}

所以你可以看到()=>的简单性。

另外

需要注意的一点是功能签名允许重载

var myTwo : {
    (x:number, y:number):number;
    (x:number):string;
}

property注释不支持哪种注释。