在typescript中指定默认值时可以使用`this`吗?

时间:2016-06-22 08:19:43

标签: typescript default-value

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中)这是有效的,因为它被转换为:

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

所以this在方法中使用了但是这被指定为合法吗?

我粗略地看了specification,无法找到答案。

注意:这在C++中是不合法的,这使我怀疑它是预期的功能还是仅仅是转换过程中的人工制品。

2 个答案:

答案 0 :(得分:4)

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

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

6.6 Code Generation节最后解释了代码是以下列形式生成的:

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

其中Parameter是参数名称,Default是默认值表达式。

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

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

答案 1 :(得分:4)

是。根据EcmaScript 6 specification它是有效的,TypeScript转换器应该这样对待它。

由于默认参数是在调用时计算的,因此您甚至可以在默认值中使用方法调用和其他参数。