Typescript对象literal "this"关键字
Typescript object literal "this" keyword
在对象文字中的函数中使用this
时,预期的行为是什么?
例如,假设我有一个类型foo
,它只有一个名为bar
的函数,并且没有其他属性。但是在fooObj.bar
方法中,我能够访问this.baz
(其中baz
不是foo
类型的属性),我没有看到任何错误。不应该打字错误,因为fooObj
没有baz
吗?
type foo = {
bar(): void;
}
var fooObj: foo = {
bar: () => {
// TS does not error out when I access this.baz
console.log(this.baz);
}
}
设置"noImplicitThis": true
编译器选项是现在启用此功能的方式。这个pull请求在对象字面量中启用了类型为this
的请求。Aleksey L最初在对这个问题的评论中提出了这个编译器选项,但当时它并没有这样工作。
您正在使用一个箭头函数,它具有词法this
。
对象文字中非箭头函数属性的简写甚至更短:
var fooObj: foo = {
bar() {
console.log(this.baz);
}
}
这个答案在提问时是正确的。自从typescript的新版本和目标javascript版本改变后,
你要求typescript推断this
是fooObj
。
Typescript通过创建一个局部变量_this
来绑定this
,该变量绑定到声明胖箭头的this
上下文。在您的示例中,this
是全局作用域,即any
。这就是它被编译成的内容:
var _this = this;
var fooObj = {
bar: function () {
// TS does not error out when I access this.baz
console.log(_this.baz);
}
};
在类中是这样的:
class Bar
{
private var = 23;
public makeSound = () => console.log(this.var)
}
// Compiles into:
var Bar = (function () {
function Bar() {
var _this = this;
this.var = 23;
this.makeSound = function () { return console.log(_this.var); };
}
return Bar;
}());
相关文章:
- 使用“;这个“;JavaScript原型方法中的关键字
- delete关键字在全局变量上的不同行为
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- JavaScript 中的嵌套函数和 “this” 关键字
- Javascript复选框函数:;缺少:在属性id之后"
- "“;变量未引用正确的对象
- "日期“;AJAX请求返回的类型值未定义
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- "这个“;javascript模块中的关键字
- "这个“;javascript回调函数中的关键字
- "这个“;javascript中的关键字(作为实例)
- "这个“;Object方法中的关键字指向Window