You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript处理unknown类型报错:Property 'errNum' does not exist on type 'object'

TypeScript unknown类型对象属性校验问题解答

为什么现有if判断无法通过TS类型校验

in运算符的类型缩小能力仅作用于联合类型的变量。你的代码中e经过typeof e === 'object' && e !== null判断后,被缩小为非联合的通用object类型,TS不会给无已知属性的通用object类型动态追加errNum属性定义,因此触发类型错误。
该错误仅为静态类型检查层面的规则限制,和运行时风险无关,也和你从tslint迁移到eslint的操作无关,是TS原生的类型校验规则触发的报错。

现有校验逻辑是否存在运行时报错风险

不存在。你已经覆盖了所有边界情况:

  • 排除了e为null/undefined的场景
  • 确认了e是对象类型
  • 确认了e自身/原型链上存在errNum属性
    运行时执行e.errNum不会抛出任何错误。

规范解决方案(无需类型断言、无需关闭类型检查)

使用TS官方推荐的**自定义类型守卫(类型谓词)**实现校验,既符合类型规范,还可复用校验逻辑适配对接第三方库的多场景需求:

  1. 先定义目标类型和校验函数
// 定义你期望的错误对象结构
interface BizError {
  errNum: number;
  // 可按需扩展其他属性
}

// 自定义类型守卫,返回值用`is`语法标记入参是否符合目标类型
function isBizError(val: unknown): val is BizError {
  return typeof val === 'object' && val !== null && 'errNum' in val;
}
  1. 在catch块中直接使用校验函数
try {
    const err = { errNum: 12 };
    throw err;
} catch (e) {
    if (isBizError(e)) {
        // 此处TS会自动将e识别为BizError类型,无类型报错
        console.log(e.errNum);
    }
}

内容的提问来源于stack exchange,提问作者Robert T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:57:02