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

And*_*ykh 14 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
Run Code Online (Sandbox Code Playgroud)

在这个代码myOnemyTwo变量实际上是一样的.它们(据我所见)是完全相同的类型,只是定义不同.

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

(x:number, y:number):number
Run Code Online (Sandbox Code Playgroud)

当我们不使用接口时,我们使用函数类型文字:

(x:number, y:number)=>number
Run Code Online (Sandbox Code Playgroud)

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

bas*_*rat 19

它们完全一样.

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

(x:number, y:number)=>number签名是一个有用的property注释:

interface MyInterface {
    (x:number, y:string):string;   
    someProperty: (x:number, y:number)=>number;
}
Run Code Online (Sandbox Code Playgroud)

这与你的相似:

var myTwo : (x:number, y:number)=>number
Run Code Online (Sandbox Code Playgroud)

只是一个冗长的简写:

var myTwo : {(x:number, y:number):number}
Run Code Online (Sandbox Code Playgroud)

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

需要注意的一点是函数签名允许重载:

var myTwo : {
    (x:number, y:number):number;
    (x:number):string;
}
Run Code Online (Sandbox Code Playgroud)

property注释不支持哪种方式.