В настоящее время у меня есть интерфейс с перегруженными функциями, например:
export interface IEvents {
method(): boolean;
on(name: 'eventName1', listener: (obj: SomeType) => void): void;
on(name: 'eventName2', listener: (obj: SomeType) => void): void;
on(name: 'eventName3', listener: (obj: SomeType) => void): void;
on(name: 'eventName4', listener: (obj: SomeType) => void): void;
on(name: 'eventName5', listener: (obj: SomeType) => void): void;
on(name: 'eventName6', listener: () => void): void;
on(name: 'eventName7', listener: (obj: SomeType) => void): void;
on(name: 'eventName8', listener: (obj: SomeType) => void): void;
}
Я пытаюсь получить объединенный тип имен событий, например, так:
eventName1 |eventName2 |...
Я пробовал следующее, но когда я делаю вывод о типе, кажется, что выбирается только одно из значений имени, а не объединение всех из них.
export type TEventExtension<T extends IEvents> {
[K in keyof T]: K extends 'on' ? TEventListenerName<T[K]> : never;
}[keyof T];
export type TEventListenerName<T> = T extends (name: infer N, listener: (obj?: infer E) => void) => void ? N : never;
const ext: TEventExtension<IEvents> = void 0 as any; // Type: 'eventName8'
Я также пытался использовать тип аккумулятора для отслеживания союзов, но Typescript не допускает рекурсивных обобщений.
Любые идеи о том, как мне это сделать?
Редактировать: Интерфейс сперегруженные определения существуют во внешнем модуле.Я пытаюсь избежать c + ping от внешних определений до моих определений, и вместо этого он автоматически создает тип.