Почему невозможно иметь несколько подписей для переменной функции "обработчик"?
Взять этот идеал, но неверный фрагмент кода в качестве примера:
class MyEntityService {
private handleThing: (a: undefined) => undefined;
private handleThing: <T extends object>(a: T) => T;
private handleThing: <T extends object>(a: T | undefined) => object | T {
if (!a) return undefined;
// Various calls to other private methods here
return a;
}
}
То, что я на самом деле хочу, это что-то в этом роде: handleThing
- это обработчик событий или тело then
обещания, которое должно иметь лексическое связывание this
(функция стрелки - самый простой способ добиться этого). Предполагается, что handleThing
поддерживает несколько подписей, так что наиболее подходящая из них может быть выбрана контекстом (т.е. в зависимости от того, где она используется).
Я также попробовал следующее, но переменная-обработчик в итоге имела тип any
, т. Е. Вся типизация была фактически пропущена:
class MyEntityService {
private handleThing = this.handleThing_.bind(this);
private handleThing_(a: undefined): undefined;
private handleThing_<T extends object>(a: T): T;
private handleThing_<T extends object>(a: T | undefined): T | undefined {
if (!a) return undefined;
// Various calls to other private methods here
return a;
}
}
Наличие только handleThing: <T extends object>(a: T | undefined) => object | undefined
не идеально:
- Он не отображается в сигнатуре действительной функции так, как мне нужно, то есть, когда мой ввод не похож на нуль, мой тип возвращаемого значения, безусловно, также не нулевой; и
- Некоторые другие методы, которые я определил в классе, ожидают, чтобы давать и получать ненулевые объекты, поэтому функция обработчика, как указано выше, не может использоваться для каждого обещания или обработчика события.
Можно было бы использовать async
функции и покончить с переменными функций-обработчиков, но это противоречило бы установленным соглашениям о коде, которые моя команда создала для проекта, в котором у меня была эта дилемма.
Поэтому я спрашиваю:
- Есть ли лучший способ достичь моей цели - сохранить безопасность типов в переменных функций обработчика в TypeScript?
- Кто-нибудь знает, почему не работает первый фрагмент?
- Есть ли вероятность того, что первый фрагмент может когда-нибудь сработать (т. Е. Выбор сигнатуры объединенной функции в дорожной карте)?