两种语法表示的内容(函数的返回值)没有区别,但一般来说,:
语法用于函数中声明和=>
语法用于函数中表达式. (Read Javascript 函数声明与函数运算符 http://helephant.com/2012/07/14/javascript-function-declaration-vs-expression/了解这两件事之间的区别。)
冒号语法至少可以追溯到已废弃的 EcmaScript 4 规范,该规范引入了使用此语法的类型注释。箭头语法来自箭头函数表达式 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions在 EcmaScript 6 中,使用粗箭头符号作为函数“关键字”。箭头语法为使用冒号会产生歧义的地方提供了简写,并且在这些情况下通常更容易直观地解析。
例如,给定一个接受回调的函数,使用:
如果不使用包装类型来表示回调的返回类型是不可能的{}
,但很简单=>
:
// ambiguous parse, syntax error
function sendString(callback: (value: string): void);
// valid, using fat arrow
function sendString(callback: (value: string) => void);
// same thing, using curly brackets
// (harder to write, harder to parse visually)
function sendString(callback: { (value: string): void; });
在类中,可以对属于函数的类属性使用粗箭头语法,但不能对方法使用粗箭头语法,如下例所示:
class Foo {
// In TypeScript’s eyes, this is actually a
// property, not a method!
someMethod: (value: string) => boolean;
}
在这种情况下,TypeScript 区分了特性一个类和methods一个类的。像这样定义为属性的函数不需要主体,但不能被覆盖或定义为子类中的方法。换句话说,即使签名是“兼容的”,你也不能这样做:
class Bar extends Foo {
// nope!
someMethod(value: string): boolean {
return true;
}
}
总之,由于类型语法在 TypeScript 中的工作方式,它是always可以对任何函数类型使用冒号语法,但它是not总是可以使用箭头语法。最重要的是编写清晰易读的代码,因此请使用最适合情况的语法。通常这意味着使用=>
对于回调参数,以及:
对于其他一切。