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官方推荐的**自定义类型守卫(类型谓词)**实现校验,既符合类型规范,还可复用校验逻辑适配对接第三方库的多场景需求:
- 先定义目标类型和校验函数
// 定义你期望的错误对象结构 interface BizError { errNum: number; // 可按需扩展其他属性 } // 自定义类型守卫,返回值用`is`语法标记入参是否符合目标类型 function isBizError(val: unknown): val is BizError { return typeof val === 'object' && val !== null && 'errNum' in val; }
- 在catch块中直接使用校验函数
try { const err = { errNum: 12 }; throw err; } catch (e) { if (isBizError(e)) { // 此处TS会自动将e识别为BizError类型,无类型报错 console.log(e.errNum); } }
内容的提问来源于stack exchange,提问作者Robert T
相关产品推荐
相关产品推荐

