redux-saga 中错误处理的打字稿

时间:2021-03-29 11:18:53

标签: reactjs typescript redux redux-saga

在 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)

1 个答案:

答案 0 :(得分:1)

正如@AlekseyL 所解释的那样。在评论中,它通常但不总是一个 Error 对象。 catch 子句要求您捕获 anyunknown您可以检查它是否是带有 Errorif (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 错误转换为带有 namemessage 的对象。

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"
    }
  }
};

Typescript Playground Link