Вот, пожалуйста ...
enum BetEventType {
One,
Two
}
type BetPayloads = {
[BetEventType.One]: { iAmOne: string; one: number };
[BetEventType.Two]: { iAmTwo: string; two: number };
};
type BetEvent = {
[T in BetEventType]: {
type: T,
payload: BetPayloads[T]
}
}[BetEventType]
const onEvent = (ev: BetEvent) => {
if (ev.type === BetEventType.Two) {
ev.type; // is BetEventType.Two
ev.payload; // is { iAmTwo: string; two: number };
ev.payload.iAmOne; // gives compile error
}
};
Демо
Я знаю, что есть принятый ответ, но этот, несомненно, лучше, потому что ...
- Нет накладных расходов времени выполнения (имеется в виду отсутствие добавления в скомпилированный код, который будет выполняться)
- Лучше
BetEvent
типа, потому что это хороший союз всех возможных типов событий (наведите курсор, чтобы увидеть, о чем я говорю)
Вы должны пометить это как принятое