TypeScript无法识别switch语句中的类型检查,如何解决?
解决TypeScript中switch语句无法识别类型收窄的问题
当使用switch(true)语句检查对象属性是否不为undefined时,TypeScript编译器无法识别该类型检查逻辑,会抛出错误'markObj.BMI' is possibly 'undefined',但相同逻辑的if/else语句可以正常触发类型收窄。
代码示例
interface Person { fullName: string; mass: number; height: number; BMI: number | undefined; calcBMI: () => number; } const markObj: Person = { fullName: "Mark Miller", mass: 78, height: 1.69, BMI: undefined, calcBMI: function (): number { const BMI: number = this.mass / this.height ** 2; this.BMI = BMI; return this.BMI; }, }; // 正常工作的if语句 if (markObj.BMI !== undefined) { console.log(markObj.BMI + 3); } // 抛出类型错误的switch语句 switch (true) { case markObj.BMI !== undefined: console.log(markObj.BMI + 3); }
解决方法
1. 使用类型断言
直接在分支中通过类型断言明确告知编译器属性的类型:
switch (true) { case markObj.BMI !== undefined: console.log((markObj.BMI as number) + 3); }
2. 将检查结果存入变量,以变量作为switch条件
TypeScript对变量的条件判断支持更完善的类型收窄,先把检查结果赋值给变量,再用变量作为switch的判断条件:
const hasValidBMI = markObj.BMI !== undefined; switch (hasValidBMI) { case true: console.log(markObj.BMI + 3); }
3. 自定义类型守卫函数
定义一个类型守卫函数,让编译器能明确识别属性的类型状态:
function hasDefinedBMI(person: Person): person is Omit<Person, 'BMI'> & { BMI: number } { return person.BMI !== undefined; } switch (true) { case hasDefinedBMI(markObj): console.log(markObj.BMI + 3); }
原因说明
TypeScript的类型收窄逻辑对if语句的条件判断有更直接的追踪能力,但switch(true)这种模式下,编译器无法建立case条件表达式与目标变量类型之间的关联,因此需要通过上述方式辅助编译器完成类型推断。
内容的提问来源于stack exchange,提问作者Rock_n_Roll_CRC
相关产品推荐
相关产品推荐

