Тип this, выведенный как 'any' в методе-прототипе класса Typescript - PullRequest
0 голосов
/ 04 мая 2020

Допустим, у меня есть класс со свойством _type и методом getType:

class Thing {
  _type: number;

  getType: () => number;
}

Затем я хочу определить метод getType вне класса:

Thing.prototype.getType = function getType() {
  return this._type;
}

В определении getType этот выводится как любой , а не тип Thing. Однако, если getType определено внутри определения класса, оно работает просто отлично.

Что не так с этим? Есть ли какой-то синтаксис, который необходимо использовать для привязки this к определению функции?

1 Ответ

1 голос
/ 04 мая 2020

Методы, объявленные в классе, будут иметь 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...