TypeScript中Error类型无lineNumber属性的解决方案问询
解决TypeScript中获取Error行号的类型问题
在JavaScript里,Error对象确实自带lineNumber属性,但TypeScript内置的Error类型并没有声明这个属性,所以直接访问会触发类型错误。除了转any,还有这几种更规范的处理方式:
1. 扩展全局Error接口
在项目中声明一个全局接口,扩展内置的Error类型,添加lineNumber属性。这样整个项目里的Error对象都会被TS识别为带有该属性:
interface Error { lineNumber?: number; } private logger(msg: string, error: Error) { const l = error.lineNumber; console.info(`info: ${msg} lineno: ${l}`); }
2. 使用自定义类型断言
定义一个结合Error和lineNumber的自定义类型,再把error断言为这个类型,比用any更具类型安全性:
type ErrorWithLineNumber = Error & { lineNumber?: number; }; private logger(msg: string, error: Error) { const e = error as ErrorWithLineNumber; const l = e.lineNumber; console.info(`info: ${msg} lineno: ${l}`); }
3. 类型守卫+可选链
通过类型守卫检查error是否包含lineNumber属性,同时用可选链避免运行时潜在错误:
private logger(msg: string, error: Error) { if ('lineNumber' in error && typeof error.lineNumber === 'number') { console.info(`info: ${msg} lineno: ${error.lineNumber}`); } else { console.info(`info: ${msg}`); } }
内容的提问来源于stack exchange,提问作者Alex Lehmann
相关产品推荐
相关产品推荐

