缩小深度嵌套对象的类型

时间:2021-06-29 19:12:58

标签: typescript axios

我正在尝试在运行时向下钻取形状未知的对象。我感到困惑的是,我在 Unsafe member access .errors on an any value 下的所有引用中都收到了 if (typeof err.response?.data === "object") 错误。但是,此时是否应该将数据缩小到具有错误属性的对象?

const getApiError = (err) => {
  if (axios.isAxiosError(err)) {
    if (typeof err.response?.data === "object") {
      if ("errors" in err.response?.data)
        if (
          Array.isArray(err.response?.data.errors) &&
          err.response?.data.errors.length > 0
        ) {
          return err.response?.data.errors[0] as ApiError
        }
    }
  }
  return null
}

此外,如果有一种更优雅的方式来深入研究这样的对象,我会全力以赴。

1 个答案:

答案 0 :(得分:0)

至于你问题的第一部分。现在输入缩小 works only on the level 区分属性已打开。因此,使用 object | null 将类型缩小为 typeof err.response?.data === 'object' 不会影响 errerr.response 类型。

至于实际例子。由于您只需要 ApiError | null 形式的结果,因此您可以省略中间步骤并直接开展业务:

const getApiError = (err: unknown): ApiError | null => {
    if (!axios.isAxiosError(err)) return null
    const errors = (err as AxiosError<{ errors: ApiError[] }>).response?.data?.errors

    return Array.isArray(errors) && errors.length > 0
        ? errors[0]
        : null
}

playground link