Используйте класс вместо интерфейса и instanceof
type guard.
const TYPEA: number = 1; // type difinition here breaks line 19
class ActionA {
type: typeof TYPEA;
payload: {
entities: [];
}
}
const TYPEB = 2;
class ActionB {
type: typeof TYPEB;
payload: {
id: number
}
}
const reducer = (action: ActionA | ActionB) => {
if (action instanceof ActionB) {
action.payload.id // OK
}
}
Playground
Однако если вы хотите сохранить интерфейсы, вам следует изменить свой кодна это:
const TYPEA = 1 as 1; // type difinition here breaks line 19
interface ActionA {
type: 1;
payload: {
entities: [];
}
}
const TYPEB = 2 as 2;
interface ActionB {
type: typeof TYPEB;
payload: {
id: number
}
}
const reducer = (action: ActionA | ActionB) => {
if (action.type === TYPEB) {
action.payload.id // OK
}
}
Детская площадка
Проблема заключалась в том, что TYPEA
и TYPEB
были выведены как number
, а не как числовые литералы (1
, 2
).