К сожалению, 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
не станет вещью.
Надеюсь, что это поможет.Удачи!