Typescript 调用签名和函数类型之间的区别

Typescript 调用签名和函数类型之间的区别,typescript,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

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

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
在该代码中,
myOne
myOne两个
变量实际上是相同的。它们(据我所见)属于同一类型,只是定义不同而已

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

(x:number, y:number):number
当我们不使用接口时,我们使用函数类型文字:


两者都表示相同的内容、参数的名称和类型以及返回类型的类型。我想知道,为什么我们需要两种不同但又如此相似的方法来用typescript写同样的东西?

它们完全相同

为什么我们需要两种不同但又如此相似的方式来用打字机写同样的东西

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

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}
因此,您可以看到
()=>
的简单性

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


属性
批注不支持该属性

此外,我们还有与调用签名或函数类型literal无关的arrow函数表达式,但它们也包含arrow
=>
。这使整个事情对我来说更加混乱。非常感谢!当你这样说的时候,它是有意义的。我真的希望
someProperty:(x:number,y:number):number受支持,但有人做出了选择。。。我已经和它讲和了。也许能让他们摆脱困境disambiguation@basarat如果我们构建了一个接受MyInterface类型变量的函数,我们如何引用其中的函数(x:number,y:string):string;)在函数中?只需在@basarat的答案上添加:也可以添加一个使用类似外观类型的属性注释来调用签名接口MyInterface{(x:number,y:string):string;someProperty(x:number,y:number):number;}`在本例中,MyInterface是一种函数类型,它具有object
someProperty
var myTwo : {(x:number, y:number):number}
var myTwo : {
    (x:number, y:number):number;
    (x:number):string;
}