如何指定变量类型使其拥有value属性?TypeScript类型报错咨询
问题分析与解决方案
报错原因
你的代码里,Num类型被定义为string | number,前两个if-else分支已经通过类型守卫把这两种类型完全覆盖了。当代码走到else分支时,TypeScript能推断出num已经没有任何可能的类型可以匹配,所以它的类型被推断为never。而never类型不存在value属性,因此触发报错。
解决方法
分两种情况处理:
- 如果
else分支是多余的:直接删除整个else分支即可,因为你本来就只需要处理string和number类型,不存在其他情况。修改后的代码如下:
type Num = string | number const num: Num = 10 as Num if (typeof num === 'string') { num.toLowerCase() // ok } else if (typeof num === 'number') { num.toPrecision(2) // ok }
- 如果
else分支是必要的:说明你需要num还能匹配另一种带有value属性的类型,这时候要修改Num的类型定义,把该类型加入联合类型。比如假设这个类型是包含value字符串属性的对象,修改后的代码如下:
type Num = string | number | { value: string } const num: Num = 10 as Num if (typeof num === 'string') { num.toLowerCase() // ok } else if (typeof num === 'number') { num.toPrecision(2) // ok } else { console.log(num.value.toLowerCase()) // 正常运行 }
关于泛型
这个场景不需要使用泛型。泛型主要用于处理类型不确定但需要保持逻辑一致性的场景(比如函数输入输出类型关联),而你的问题只是联合类型的覆盖范围问题,和泛型无关。
内容的提问来源于stack exchange,提问作者nini
相关产品推荐
相关产品推荐

