【发布时间】:2020-01-08 20:04:27
【问题描述】:
我正在创建一个反应应用程序并使用打字稿。我想要一个具有多个属性的 globalState。我还需要使用useReducer。我为reducer 函数的action 创建了一个接口。该接口接受一个参数N,它将是name。现在我想根据传递的N参数设置data的类型。
我几乎已经使用三元运算符创建了它。
export interface IGlobalState {
loading: boolean;
userData: IUserData;
}
interface IUserData {
loggedIn: boolean;
name: string;
}
type GlobalStateActionNames = "setLoading" | "setUserData"
export interface IGlobalStateAction<N extends GlobalStateActionNames = GlobalStateActionNames> {
data: N extends "setLoading"
? boolean
: N extends "setUserData"
? IUserData
: any;
name: N;
}
export const GlobalStateReducer = (
state: IGlobalState,
{name, data}: IGlobalStateAction
): IGlobalState => {
switch(name){
case "setLoading": return {...state, loading: data};
default: return state;
}
};
只有一个问题。 reducer 中的 data 参数将扩展所有可能是数据值的类型。因此,当我将 loading 设置为 data 时,它会出错。
类型
'boolean | IUserData'不可分配给类型'boolean'
我有两个问题。
- 如何解决此错误?
- 有没有更好的方法来实现上述功能?
注意:我知道我可以使用case "setLoading": return {...state, loading: data as boolean}; 解决这个问题。但是 globalState 会有很多其他的 props。所以我不想对所有的价值观都这样做。
【问题讨论】:
标签: javascript typescript react-hooks