在打字稿中指定默认值时可以使用`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 转译器应该这样对待它。
由于默认参数是在调用时计算的,您甚至可以在默认值中使用方法调用和其他参数。
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 转译器应该这样对待它。
由于默认参数是在调用时计算的,您甚至可以在默认值中使用方法调用和其他参数。