TypeScript中方法的参数列表中的范围是this
吗?
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++中是不合法的,这使我怀疑它是预期的功能还是仅仅是转换过程中的人工制品。
答案 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转换器应该这样对待它。
由于默认参数是在调用时计算的,因此您甚至可以在默认值中使用方法调用和其他参数。