2016-06-22 51 views
6

this范围内TypeScript方法的参数列表中?在打字稿中指定默认值时可以使用`this`吗?

考虑following code

class Foo { 
    constructor(public name) {} 
    bar(str: string = this.name) { console.log(str); } 
} 

let f = new Foo("Yo"); 
f.bar(); 

即使我们不是一个实例方法体内的str默认值是使用this规定。

目前(以打字稿1.8)这个作品,因为它是transpiled到:

Foo.prototype.bar = function (str) { 
    if (str === void 0) { str = this.name; } 
    console.log(str); 
}; 

所以this用于的方法,但这种规定是合法的吗?

我无法找到一个答案,这与在specification粗略地看一眼。

注意:这是不合法的C++这使我怀疑它是一个预期的功能,或者只是一个人工翻译过程。

回答

4

在部分8.3.1 Constructor Parameters明确指出使用this构造函数参数默认值表达式是一个错误。

8.4.2 Member Function Declarations部分中,没有提及在普通类方法(非构造函数)的默认值表达式中使用this的任何错误。

6.6 Code Generation最后解释说,代码的形式产生:

if (<Parameter> === void 0) { <Parameter> = <Default>; } 

当参数是参数名称和默认值是默认值表达式。

换句话说,当前规范明确允许在构造函数中使用参数默认值表达式中的this

根据规范,您的代码完全有效。

4

是的。根据EcmaScript 6 specification有效,TypeScript转译器应该如此处理。

作为默认参数在呼叫时计算,你甚至可以使用方法调用和其他参数的默认值。

+3

你知道在es6规范的哪里吗? – Alex

+0

[这里](http://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions)中的规格。此外,还给出了一个很好的概述(https://developer.mozilla.org/cs/docs/Web/JavaScript/Reference/Functions/Default_parameters),指出默认参数在通话时进行评估。 –

相关问题