让我们说我们使用像这样的显式类型定义一个函数,
func = function name(arg1: string, arg2: number) : boolean {return true;}
你可以看到我们应该使用' => '在这里,但我们不能在功能减少中使用这个胖箭头。
var lambdaFunc = (arg1: string, arg2: number) => true;
但是在lambda函数中,我们使用' => '这个胖箭为什么?
interface SearchFunc {
(source: string, subString: string): boolean;
}
在函数类型接口中我们使用它的原因,例如,我们使用':'结肠。
C
这整个混乱是什么?
答案 0 :(得分:9)
两个语法表示的内容(函数的返回值)没有区别,但一般来说,:
语法用于函数声明和{{ 1}}语法用于函数表达式。 (阅读Javascript function declarations vs function operators,了解这两件事之间的区别。)
冒号语法至少可以追溯到废弃的EcmaScript 4规范,该规范使用此语法引入了类型注释。箭头语法来自EcmaScript 6中的arrow function expression,它使用胖箭头符号作为函数“keyword”。箭头语法为使用冒号时存在歧义的地方提供了简写,并且在这些情况下通常更容易在视觉上进行解析。
例如,给定一个接受回调的函数,如果不使用=>
包装类型,则使用:
来表示回调的返回类型是不可能的,但{}
很简单:
=>
在类中,可以将fat arrow语法用于作为函数的类的属性,但不能用于方法,如本示例所示:
// 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; });
在这种情况下,TypeScript区分类的属性和类的方法。定义为此类属性的函数不需要正文,但不能覆盖或定义为子类中的方法。换句话说,即使签名是“兼容的”,你也不能这样做:
class Foo {
// In TypeScript’s eyes, this is actually a
// property, not a method!
someMethod: (value: string) => boolean;
}
总之,由于类型语法在TypeScript中的工作方式,始终可以对任何函数类型使用冒号语法,但它总是不可以使用箭头语法。最重要的是编写清晰易读的代码,因此请使用最适合该情况的语法。通常,这意味着将class Bar extends Foo {
// nope!
someMethod(value: string): boolean {
return true;
}
}
用于回调参数,并将=>
用于其他所有内容。
答案 1 :(得分:2)
假设我们使用这样的显式类型定义函数, var func:(arg1:string,arg2:number)=>布尔; 你可以看到我们应该使用' => '
这是一个简写。长手使用:
:
var func : {(arg1: string, arg2: number): boolean;}
但是在lambda函数中,我们使用' => '这个胖箭为什么? var lambdaFunc =(arg1:string,arg2:number)=>布尔;
不正确。你仍然在这里使用:
。即
var lambdaFunc = (arg1: string, arg2: number):boolean => true;
在函数类型接口中我们使用它的原因,例如,我们使用':'结肠。
正如我们使用:
一样,就像你在这里展示的其他例子一样。
速记令人困惑,奇怪的是。不喜欢它吗?使用长手