2016-10-26 2 views
2

Какое ожидаемое поведение при использовании «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

Вы пробовали настройки '«noImplicitThis»: опция true' компилятор? –

ответ

3

Вы используете функцию стрелки, which has lexical this.

Стенограмма для функции собственности без стрелки в виде литерала объекта еще короче, хотя:

var fooObj: foo = { 
    bar() { 
     console.log(this.baz); 
    } 
} 
+0

Остается вопрос: что такое 'baz' и почему Type Type не говорит вам, что' foo' (который должен быть типом 'this', я думаю) не имеет свойства' baz'? Я не очень разбираюсь в TypeScript, но не в том смысле, что ваши типы должны явно определять свои свойства? Я думаю, вопрос в том, почему '' 'типа' any' внутри лексически связанной функции, а не типа 'foo'? – meagar

+1

@meagar: 'foo' не должен быть типом' this'. 'this' будет тем, чем бы это было в функции, содержащей литерал объекта. – Ryan

+0

А, да. Я замалчивался тем, что мы не являемся объявлением класса ES6. Почему тогда TypeScript не рассматривает контекст объявления литерала объекта и видит, что какой бы тип 'this' по-прежнему не имеет свойства' baz'? – meagar

2

Вы просите машинописный сделать вывод, что this является fooObj.

Машинопись связывает this путем создания локальной переменной _this, который связан с this -context, где объявлен жир стрелка. И в вашем случае 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; 
}()); 
Смежные вопросы