Методы, объявленные в классе, будут иметь this
типы в качестве экземпляра класса (хотя нет гарантии, что this
фактически будет экземпляром типа во время выполнения).
Функции, определенные и присвоенные прототипу, o выиграют от любого вывода для this
, поскольку сигнатура метода фактически не сохраняет тип this
.
class Thing {
getType() { }
}
let fn = Thing.prototype.getType // fn has type ()=> void instead of (this: Thing) =>
обсуждение, чтобы лучше набрать this
, но его влияние на производительность было непомерно высоким (10-20% воздействия на тяжелый код класса, если я правильно помню), поэтому оно было отменено. Хотя в приведенном выше примере это кажется тривиальным, набирать this
непросто, если учесть производные классы, поскольку this
должен быть по существу параметром типа, что вызывает замедление.
Вы можете использовать явную аннотацию для this
(дополнительный параметр будет удален во время компиляции):
Thing.prototype.getType = function getType(this: Thing) {
return this._type;
}
Playground Link
Или, если, как и в вашем случае, метод фактически объявлен как поле в классе, вы можете добавить аннотацию для этого в сигнатуру поля и воспользоваться аннотацией при ее назначении:
class Thing {
_type!: number;
getType!: (this: Thing) => number;
}
Thing.prototype.getType = function getType() {
return this._type;
}
Playground Link