在对象文字中的函数内使用“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);
}
}
答案 0 :(得分:3)
您正在使用箭头功能which has lexical this
。
但是,对象文字中非箭头函数属性的简写更短:
PS C:\Users\user> New-TestMultipleDefaultValues -SomeOtherThingThatIfSpecifiedShouldResultInTest1HavingValue1 "thing"
Value1
PS C:\Users\user> New-TestMultipleDefaultValues
Value2
PS C:\Users\user> New-TestMultipleDefaultValues -Test1 "test"
test
答案 1 :(得分:3)
您要求打字稿来推断this
是fooObj
。
Typescript通过创建一个局部变量this
来绑定_this
,该变量绑定到this
- 声明fat-arrow的上下文。在您的情况下,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;
}());
答案 2 :(得分:0)
设置"noImplicitThis": true
编译器选项是您现在启用此功能的方式。 This pull request已启用在对象文字中键入this
的功能。 Aleksey L最初是在对问题的评论中建议使用此编译器选项的,但当时并没有这种功能。