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

Can `this` be used when specifying a default value in typescript?

this 是否在 TypeScript 方法参数列表的范围内?

考虑 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++ 中是不合法的,这让我怀疑它是预期的功能还是只是转译过程的人工制品。

8.3.1 Constructor Parameters节中明确指出在构造函数参数默认值表达式中使用this是错误的。

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

小节6.6 Code Generation最后说明代码生成形式为:

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

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

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

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

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

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