TypeScript中number变量typeof判断后赋值报错never类型的原因
问题:TypeScript中number类型变量调用toString报错“类型'never'上不存在属性'toString'”?
以下代码执行时出现困惑:
var label: number = 12354; if(typeof(label) == 'number'){ label = label.toString(); }
明明label声明为number类型,但在if分支内部调用toString()时,却提示错误:The property 'toString' does not exist in type 'never'.ts(2339)。将label改为any类型后错误消失,想知道TypeScript为何做出这种类型判断?
解答
核心原因是TypeScript的类型收缩和变量类型兼容性检查共同作用的结果:
你给label声明了明确的
number类型,初始赋值也是数字。进入typeof(label) === 'number'分支后,TypeScript会把label的类型收缩为更精确的number类型,但此时你要把toString()返回的string类型值,赋值给原本被限定为number类型的变量。TypeScript会计算赋值后的变量类型:number和string类型没有交集,所以它推断这个变量的类型会变成
never(没有任何值能同时属于number和string)。而never类型上没有任何属性和方法,自然就会报toString不存在的错误。改成any类型后,TypeScript关闭了对该变量的类型校验,所以错误消失,但这相当于放弃了TypeScript的类型安全特性,不推荐这么做。
正确的解决方式
有两种常见的合理方案:
- 方案1:使用联合类型,允许label同时是number或string类型:
let label: number | string = 12354; if (typeof label === 'number') { label = label.toString(); }
- 方案2:声明新变量接收转换结果,保持原变量的类型不变:
const label: number = 12354; let labelStr: string; if (typeof label === 'number') { labelStr = label.toString(); }
内容的提问来源于stack exchange,提问作者Hime
相关产品推荐
相关产品推荐

