我正在尝试在运行时向下钻取形状未知的对象。我感到困惑的是,我在 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
}
此外,如果有一种更优雅的方式来深入研究这样的对象,我会全力以赴。
答案 0 :(得分:0)
至于你问题的第一部分。现在输入缩小 works only on the level 区分属性已打开。因此,使用 object | null
将类型缩小为 typeof err.response?.data === 'object'
不会影响 err
和 err.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
}