'有什么区别? :'和' => '关于打字稿中的功能?

时间:2015-10-28 20:02:06

标签: typescript

让我们说我们使用像这样的显式类型定义一个函数,

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

这整个混乱是什么?

2 个答案:

答案 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;
  

在函数类型接口中我们使用它的原因,例如,我们使用':'结肠。

正如我们使用:一样,就像你在这里展示的其他例子一样。

简而言之

速记令人困惑,奇怪的是。不喜欢它吗?使用长手