Как я могу экспортировать тип возвращаемого значения создателей Action, используя Flow? - PullRequest
0 голосов
/ 22 октября 2018

В настоящее время я экспортирую 2 создателей действий:

export const login = (payload: $PropertyType<Actions.Login, 'payload'>): Actions.Login => ({
  type: LOGIN,
  payload,
})

export const logout = (payload: $PropertyType<Actions.Logout, 'payload'>): Actions.Logout => ({
  type: LOGOUT,
  payload,
})

Это их соответствующие действия:

export type Login = {
  type: ActionType,
  payload: {
    username: string,
    password: string,
  },
}

export type Logout = {
  type: ActionType,
  payload: null,
}

В другом файле я импортирую создателей с использованием синтаксиса с подстановочными знаками

import * as Actions from ...

Затем я пытаюсь извлечь из этих действий форму их возвращаемого типа для использования в качестве типа действия для моих редукторов.

Я пытаюсь получить следующее(Я думаю, поскольку я предполагаю, что именно это Flow ожидает удовлетворить требованиям редукторов - свойство type):

type Action = { 
    login: { type: '', payload: '' }, 
    logout: { type: '', payload: '' } 
}

Я достиг этой функции:

type Action = $ObjMap<typeof Actions, <V>(V) => $Call<V>>

Что возвращает следующее:

Action: type Action = { 
    login: Login,
    logout: Logout
}

Что действительно является действиями, возвращенными этими создателями.Однако поток внутри редуктора не обнаруживает свойство type в этом действии.

Редуктор выглядит следующим образом:

const reducer = (state: State = initialState, action: Action): State => {
  switch (action.type) {
    case LOGIN:
      return { ...state }
    default:
      return state
  }
}

С ошибкой в ​​action.type, равной:

[flow] property `type` is missing in object type [1]. (References: [1])

Любая помощь в написании лучшей, обобщенной функции очень ценится.Спасибо.

1 Ответ

0 голосов
/ 15 декабря 2018

Сначала импортируйте тип экспорта модуля из модуля, содержащего создателей действий:

import typeof * as ActionCreators from './actions'

Это будет тип объекта, поэтому служебный помощник $ObjMap можетиспользоваться для сопоставления каждого создателя действия с его типом возвращаемого значения.Здесь требуется внимание:

  • , чтобы гарантировать, что действие A, возвращаемое создателем действия, точно
  • , чтобы использовать $Values для получения объединениявсех точных типов действий

Следующее должно привести к типу, который содержит объединение всех возможных действий, возвращаемых создателями, которые могут быть легко уточнены свойством { type } в редукторах:

type Action = $Values<$ObjMap<ActionCreators, <A>((...any[]) => A) => $Exact<A>>>

Вы можете просмотреть этот пример на Попробуйте Flow , чтобы увидеть его в действии.Обратите внимание, что для типов действий login и logout случай по умолчанию при назначении строки типа действия пустой ;(action.type: empty) вызывает ошибки, которые action.type === 'login' и action.type === 'logout' не были обработаны.

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