Как я могу написать этот код, чтобы вывод машинописи был счастлив? - PullRequest
0 голосов
/ 12 марта 2020

Это очень упрощенная функция редуктора.

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
  }
}

enter image description here Внезапно TypeScript не может гарантировать, что когда action.type === EnumOne.ABC или action.type === EnumTwo.EFG, тип действия будет SomethingOne или SomethingTwo соответственно. Я полагаю, что это потому, что action также может быть AnythingElse, но компилятор не может знать.

Мой вопрос: как мне написать эту логику c так, чтобы она удовлетворяла TypeScript?

РЕДАКТИРОВАТЬ

Я знаю, что вы можете отключить TypeScript с помощью приведения типов, но я надеюсь, что кто-то более знаком с TypeScript и покажет мне способ, который позволяет избежать использования приведения типов.

1 Ответ

0 голосов
/ 12 марта 2020

Вы можете использовать что-то вроде:

 interface Action<T = { [key: string]: string }> {
   type: string
   payload: T
 }

И

function reducerFunction(
  action: Action<any>
): string {
  switch(action.type) {
    case EnumOne.ABC:
      return action.payload.foo
    case EnumTwo.EFG:
      return action.payload.bar
    default:
      return action.type
  }
 }

Затем верните action.paylod.foo или action.payload.wh независимо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...