Машинописный объект, литерал "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;
}());
Другие вопросы по тегам