Машинописный объект, литерал "this", ключевое слово
Каково ожидаемое поведение при использовании "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);
}
}
2 ответа
Настройка "noImplicitThis": true
опция компилятора - это то, как вы бы включили эту функцию сейчас Этот запрос на включение включен this
в объектных литералах. Алексей Л изначально предложил этот вариант компилятора в комментарии к вопросу, но в то время он не работал таким образом.
Вы используете функцию со стрелкой, которая имеет лексическийthis
,
Сокращение для свойства функции без стрелки в литерале объекта еще короче:
var fooObj: foo = {
bar() {
console.log(this.baz);
}
}
Вы просите машинопись, чтобы сделать вывод, что this
является fooObj
,
Машинопись связывает 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;
}());