Это очень упрощенная функция редуктора.
enum EnumOne {
ABC = 'ABC'
}
enum EnumTwo {
EFG = 'EFG'
}
interface SomethingOne {
type: EnumOne
foo: string
}
interface SomethingTwo {
type: EnumTwo
bar: string
}
function reducerFunction(
action: SomethingOne | SomethingTwo
): string {
switch(action.type) {
case EnumOne.ABC:
return action.foo
case EnumTwo.EFG:
return action.bar
}
}
Теперь я хочу заставить someReducer
обобщенно обрабатывать все остальные действия, изменяя приведенный выше код следующим образом:
interface AnythingElse {
type: string
}
function reducerFunction(
action: SomethingOne | SomethingTwo | AnythingElse
) {
switch(action.type) {
case EnumOne.ABC:
return action.foo
case EnumTwo.EFG:
return action.bar
default:
return action.type
}
}
Внезапно TypeScript не может гарантировать, что когда action.type === EnumOne.ABC
или action.type === EnumTwo.EFG
, тип действия будет SomethingOne
или SomethingTwo
соответственно. Я полагаю, что это потому, что action
также может быть AnythingElse
, но компилятор не может знать.
Мой вопрос: как мне написать эту логику c так, чтобы она удовлетворяла TypeScript?
РЕДАКТИРОВАТЬ
Я знаю, что вы можете отключить TypeScript с помощью приведения типов, но я надеюсь, что кто-то более знаком с TypeScript и покажет мне способ, который позволяет избежать использования приведения типов.