let f1: {(): number}
let f2: () => number
let f3: {() => number} // error TS1005: ':' expected.
看起来f1
和f2
声明是等价的,是真的吗?
为什么f3
是错误的?
答案 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 {}