У меня есть дискриминируемый союз, описывающий тип события. Тогда у меня есть addEventHandler
функция, которая принимает идентификатор события в качестве первого аргумента и обратный вызов события в качестве второго. Поле идентификатора события является дискриминатором типа объединения.
interface TestEventA {
id: 'TestEventA';
payload: null;
}
interface TestEventB {
id: 'TestEventB';
payload: TestEventBPayload;
}
interface TestEventBPayload {
content: string;
}
interface TestEventC {
id: 'TestEventC';
payload: TestEventCPayload;
}
interface TestEventCPayload {
value: number;
}
type TestEvent = (TestEventA | TestEventB | TestEventC);
function addEventHandler<T extends TestEvent['id']>(eventId: T, listener: (data: (TestEvent & { id: T })) => void) {
eventEmitter.on(eventId, listener);
}
addEventHandler('TestEventC', (event) => {
// I want event to be of type TestEventC, but instead it is of type
// (TestEventA & { id: "TestEventC"; }) | (TestEventB & { id: "TestEventC"; }) | (TestEventC & { id: "TestEventC"; })
// event.payload: Object is possibly 'null'
// Property 'value' does not exist on type 'TestEventBPayload | TestEventCPayload'
console.log(event.payload.value);
if (event.id === 'TestEventC') { // redundant condition
console.log(event.payload.value); // No error here
}
});
Как настроить addEventHandler
функцию обратного вызова для определения типа события?