type ErrorConstructor = new (...args: any[]) => Error /** * 提取错误消息(兼容 Axios / fetch 等 HTTP 响应错误) * * 提取顺序: * 1. error.response.data.error / message (Axios 后端自定义) * 2. error.response.statusText (Axios HTTP 状态文本) * 3. error.data.error / message (部分 fetch 封装库) * 4. error.statusText (部分 fetch 封装库) * 5. error.message (原生 Error) */ function extractErrorMessage(error: Error): string | undefined { const err = error as any // Axios 风格: error.response.data / error.response.statusText const axiosData = err?.response?.data if (axiosData?.error) return axiosData.error if (axiosData?.message) return axiosData.message if (err?.response?.statusText) return err.response.statusText // 部分 fetch 封装库: error.data / error.statusText if (err?.data?.error) return err.data.error if (err?.data?.message) return err.data.message if (err?.statusText) return err.statusText // 原生 Error return error.message } /** * 判断目标是否是指定的 Error * * - 无参数: 判断是否是 Error 类型 * - `string`: 精确匹配错误消息 * - `RegExp`: 正则匹配错误消息 * - `Error 构造函数`: instanceof 检查 * - `{ type: string }`: 匹配 error.type 属性 * * 消息提取顺序 (兼容 Axios / fetch 等 HTTP 库): * 1. error.response.data.error / message (Axios 后端自定义) * 2. error.response.statusText (Axios HTTP 状态文本) * 3. error.data.error / message (部分 fetch 封装库) * 4. error.statusText (部分 fetch 封装库) * 5. error.message (原生 Error) * * @example * * // `string` 目标,判断 err(message)是否是 "ErrorA" 错误 * errorOf(err, "ErrorA") * * // `RegExp` 目标, 使用正则判断 err(message)是否是 "TypeError" 开头错误 * errorOf(err, /^TypeError/) * * // `Error` 目标, 判断 err 是否是 Error 类型 * errorOf(err, TypeError) * * // `object` 目标, 判断 err.type 是否等于指定的 type * errorOf(err, { type: "CustomErrorType" }) * * */ export function errorOf(error: unknown): error is Error export function errorOf(error: unknown, errorDefine: T): error is InstanceType export function errorOf(error: unknown, errorDefine: string | RegExp | { type: string }): boolean export function errorOf(error: unknown, errorDefine?: string | RegExp | ErrorConstructor | { type: string }): boolean { // 基础检查:必须是 Error 实例 if (!(error instanceof Error)) return false // 无定义时,仅判断是否为 Error if (errorDefine === undefined) return true // 字符串匹配 if (typeof errorDefine === "string") { return extractErrorMessage(error) === errorDefine } // 正则匹配 if (errorDefine instanceof RegExp) { const msg = extractErrorMessage(error) return msg !== undefined && errorDefine.test(msg) } // 构造函数匹配 (如 TypeError, RangeError) if (typeof errorDefine === "function") { return error instanceof errorDefine } // 对象属性匹配 if (typeof errorDefine === "object" && "type" in errorDefine) { return (error as any).type === errorDefine.type } return false }