在 worker saga 的 catch 块中处理的 action.ts 中的 error
类型是什么?
action.ts
const actionError = (error): IFluxStandardAction => {
return {
type: ACTIONTYPE_ERROR,
payload: error
};
};
saga.ts
function* WorkerSaga(value) {
try {
const { payload } = value;
const response: Response = yield call(clientApi, payload);
yield put(Actions.Success(response));
} catch (error) {
yield put(Actions.Error(error));
}
}
Parameter 'error' implicitly has an 'any' type, but a better type may be inferred from usage.ts(7044)
答案 0 :(得分:1)
正如@AlekseyL 所解释的那样。在评论中,它通常但不总是一个 Error 对象。 catch
子句要求您捕获 any
或 unknown
。您可以检查它是否是带有 Error
的 if (error instanceof Error)
。 >
Error
是不可序列化的。理想情况下,您应该在您的传奇或动作创建者中从中提取一些属性,而不是在动作中传递不可序列化的对象。提取 string
很容易。
catch (error: any) {
yield put(Actions.Error(String(error) || "An unknown error occurred"));
}
string
对象的 Error
转换是这样的:
String(new Error("some message"))
--> "Error: some message"
这是一个类型安全的帮助程序,用于将 any
错误转换为带有 name
和 message
的对象。
interface ErrorData {
name: string;
message: string;
}
const toError = (error: any): ErrorData => {
if (error instanceof Error) {
return {
name: error.name,
message: error.message
};
} else {
return {
name: "Error",
message: error?.toString() || "An unknown error occurred"
}
}
};