Typescript Типы и .bind - PullRequest
       1

Typescript Типы и .bind

0 голосов
/ 15 февраля 2019

Я начинаю вникать в дженерики и получаю общий класс событий, который выглядит следующим образом

export interface Listener < T > {
  (event: T): any;
}

export class EventTyped < T > {
  //Array of listeners
  private listeners: Listener < T > [] = [];

  Attach(listener: Listener < T > ) {
    this.listeners.push(listener);
  }

  Emit(event: T) {
    this.listeners.forEach(listener => listener(event));
  }
}

Я создаю свое событие следующим образом onPageSizeSelected = new EventType<PageSizeSelector>();

Моя подпись слушателей таковаPageSizeSelectedHandler(event:Event,object:PageSizeSelector).

Когда я присоединяюсь к такому событию pageSizeSelector.onPageSizeSelected.Attach(this.PageSizeSelectedHandler.bind(this)), ошибка не выдается.Когда обработчик прикреплен вот так pageSizeSelector.onPageSizeSelected.Attach(this.PageSizeSelectedHandler).Он сразу обнаруживает, что сигнатура метода неверна и имеет слишком много параметров.

Что делает связывание, когда машинопись не может правильно определить сигнатуру метода?Как я могу безопасно хранить свой this и иметь строго напечатанное событие?

1 Ответ

0 голосов
/ 15 февраля 2019

К сожалению, TypeScript не делает большую работу по проверке типов this контекстов автоматически.Существует предложение добавить что-то вроде опции компилятора --strictThis, которая помешает вам обойти ошибочно связанные функции, но это еще не реализовано, по-видимому, потому что оба сломаютмного существующего кода и оказывают существенное влияние на производительность компилятора .Если вы хотите, чтобы это было реализовано, вы, возможно, захотите перейти к этой проблеме GitHub и указать ей ? и / или описать свой вариант использования (если он особенно убедителен и еще не упомянут в этой проблеме).

Если вы действительно хотите, чтобы компилятор делал эту проверку, возможно , но вам нужно будет вручную добавить this параметры во все виды мест вваш код.Например (и вот где минимальный, полный и проверяемый пример с вашим определением PageSizeSelectedHandler пригодился бы), вы могли бы сделать что-то вроде этого:

// explicitly add void this-context to definition of Listener
export interface Listener<T> {
  (this: void, event: T): any;
}

// explicitly add class-based this-context to all methods 
class StringListeningClassThing {
  myString = "hey";
  doSomething(this: StringListeningClassThing, x: string) {
    return x + this.myString;
  }
}

const onPageSizeSelected = new EventTyped<string>();
const stringListenerThingy = new StringListeningClassThing();

// enjoy type safety   
onPageSizeSelected.Attach(stringListenerThingy.doSomething); // error as desired
onPageSizeSelected.Attach(stringListenerThingy.doSomething.bind({notGood: true})); // also error
onPageSizeSelected.Attach(stringListenerThingy.doSomething.bind(stringListenerThingy)); // okay!

Таккомпилятор может применять это, но не автоматически.К сожалению, это лучший ответ, который я могу дать на данный момент, до тех пор, пока --strictThis не станет вещью.

Надеюсь, что это поможет.Удачи!

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