我正在redux中编码功能组件,并为特定操作添加了返回值。
新值来自Promise,因此,如果将类型称为Ival
,则返回值将为Promise<Ival | null>
类型(如果响应失败,则返回null)。
我的问题是如何确定Ival
的返回类型?
这是动作:
export const addVal = (data: IData) => async (dispatch: IDispatch): Promise<IVal | null> => {
try {
const resp = await api.vals.create(data);
dispatch({ type: "CREATE_VAL", payload: resp });
return resp;
} catch (error) {
dispatch({ type: "ERROR_MSG" ,payload: error });
return null;
}
};
这是我使用的调度功能:
const createNewConnection = async (data: IData): Promise<void> => {
try {
const newVal: IVal | null = await dispatch(addVal(data));
onValCreated(newVal);
} catch (e) {
onValCreated(null);
}
};
onValCreated
函数接收一个IVal
类型作为参数,这是错误消息:
“ TS2559:类型'(dispatch:IDispatch)=> Promise'与类型'IVal'没有共同的属性”
我尝试了同时发送:
// First try
const newVal: IVal | null = await dispatch<IVal | null>(addVal(data));
// Second try
const newVal: IVal | null = await dispatch<Promise<IVal | null>>(addVal(data));
但这没用
答案 0 :(得分:0)
await
关键字基本上在JS中“解包”一个Promise,等待一个Promise<number>
,将返回一个number
,表示您已经有了正确的方法。但是从外观上看,您试图在错误的位置应用此规则。当您调用 时不必等待,而是在处理函数中的 returned 值时就意味着(意味着:将参数传递给onValCreated
而不是{ {1}})。但是,错误消息为您提供了分派功能,因为这是从中获取“错误类型”的地方。
解决方法很少,只需执行以下操作,然后等待“嵌套”即可“解开” Promise:
dispatch
答案 1 :(得分:0)
该操作返回一个函数,该函数接收一个调度作为参数,然后返回我想要的值。所以我要做的是创建一个执行操作的const,然后通过分派执行此变量。最终它返回了我想要的类型的承诺!
try {
const newVal = await addVal(data);
onValCreated(await newVal(dispatch));
} catch (e) {
onValCreated(null);
}