Javascript 如何使用流导出动作创建者返回值的类型?
我目前正在导出2个动作创建者:Javascript 如何使用流导出动作创建者返回值的类型?,javascript,reactjs,redux,flowtype,flow-typed,Javascript,Reactjs,Redux,Flowtype,Flow Typed,我目前正在导出2个动作创建者: export const login = (payload: $PropertyType<Actions.Login, 'payload'>): Actions.Login => ({ type: LOGIN, payload, }) export const logout = (payload: $PropertyType<Actions.Logout, 'payload'>): Actions.Logout =>
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,
})
import typeof * as ActionCreators from './actions'
在另一个文件中,我使用通配符语法导入创建者
import * as Actions from ...
然后,我试图从这些动作中提取它们的返回类型的形状,作为我的减缩器的动作类型
我试图获得的是以下内容(我认为,因为我假设这是Flow期望满足减速器要求的内容–一个类型
属性):
我已达到此功能:
type Action = $ObjMap<typeof Actions, <V>(V) => $Call<V>>
这确实是那些创造者返回的行为。但是,减速器内的流量不会在该动作的类型属性上增加
减速器如下所示:
const reducer = (state: State = initialState, action: Action): State => {
switch (action.type) {
case LOGIN:
return { ...state }
default:
return state
}
}
操作时出现错误。类型为:
[flow] property `type` is missing in object type [1]. (References: [1])
非常感谢您对编写更好的通用函数的任何帮助。谢谢。首先,从包含动作创建者的模块导入模块导出的类型:
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,
})
import typeof * as ActionCreators from './actions'
这将是一种对象类型,所以可以使用实用工具帮助器将每个动作创建者映射到其返回值的类型。这里需要注意的是:
- 确保从动作创建者返回的动作
A
准确无误
- 利用以获得所有精确动作类型的并集
下面的类型应包含创建者返回的所有可能操作的联合,这些操作可以通过reducer中的{type}
属性轻松细化:
type Action = $Values<$ObjMap<ActionCreators, <A>((...any[]) => A) => $Exact<A>>>
type Action=$Values
type Action = $Values<$ObjMap<ActionCreators, <A>((...any[]) => A) => $Exact<A>>>