typescript:声明函数类型的等效方法?

typescript:声明函数类型的等效方法?,typescript,Typescript,看起来f1和f2声明是等价的,是真的吗 为什么f3是一个错误?是的,您可以指定函数的返回类型 let f1: {(): number} let f2: () => number let f3: {() => number} // error TS1005: ':' expected. 例如,大括号表示法允许您定义重载方法签名和/或混合类型 let f1 = function (): boolean {} 有两个调用签名和一个属性栏 如果您只有一个呼叫签名而没有属性,则可以使用

看起来
f1
f2
声明是等价的,是真的吗


为什么
f3
是一个错误?

是的,您可以指定函数的返回类型

let f1: {(): number}

let f2: () => number

let f3: {() => number} // error TS1005: ':' expected.

例如,大括号表示法允许您定义重载方法签名和/或混合类型

let f1 = function (): boolean {}
有两个调用签名和一个属性


如果您只有一个呼叫签名而没有属性,则可以使用用于
f2
的速记语法。因此,使用大括号,您必须使用
将参数与返回类型分开,并且在使用
=>
的简写语法中,它们不是等价的

f1的语法通常定义对象文字。即使在这种特定情况下,如果您只有一个调用签名而没有属性,您也可以(而且应该)省略{}大括号以避免混淆

如果您的返回类型应该是一个函数,那么f2肯定是一个不错的选择

在对象文字中,您可以指定键和返回值,例如:

interface Foo {
    (x: number): void,
    (x: string): void,
    bar: string,
}

考虑到这个例子,我想很清楚为什么f3是无效的

他要求使用可变返回类型。在您的例子中,您刚刚声明了分配给f1
f1
f2
的随机函数的返回类型是等效的,如果查看推断的类型,则两者都是
()=>number
否。结果可能是等效的,但这并不意味着它们都表示相同的内容。空对象文字只是一个特殊条件,它“偶然”解析为与f2相同的结果。如果你想定义一个函数作为返回值f2是一种方法,因为它是完全清楚的,没有机会误解它。我同意如果你想要一个函数,你应该像定义
f2
一样定义它,但是在这个特殊的情况下,
f1
f2
是等价的,因此,代表相同的东西。它不仅仅是一个对象文字,你可以使用这个符号有效地定义具有其他属性的函数,看看@tao的答案。我理解你的观点:@tao的答案中的D类型必须是一个具有指定返回值的对象,例如,{x:(param:number):void=>{},bar:'test'},但我仍然认为它们有不同的意图。如果我必须验证/读取您的代码,我假设对于f1,您希望将对象声明为类型,而对于f2,您不应该像
f1
那样定义它,如果您希望具有类型
()=>编号
:-)
let f4: {test: string, testFn: () => number};