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

时间:2018-02-07 08:07:36

标签: typescript

let f1: {(): number}

let f2: () => number

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

看起来f1f2声明是等价的,是真的吗?

为什么f3是错误的?

3 个答案:

答案 0 :(得分:3)

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

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

有两个呼叫签名和一个属性bar

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

答案 1 :(得分:1)

它们并不等同。

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

如果你的返回类型应该是一个函数,那么f2绝对是你的选择。

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

let f4: {test: string, testFn: () => number};

考虑到这个例子,我认为很明显为什么f3无效。

答案 2 :(得分:-3)

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

let f1 = function (): boolean {}