TypeScript使用Partial类型时PhpStorm出现narrowed type警告如何解决
警告触发原因
你代码中inner的类型是Partial<Inner>,所有属性都是可选状态,inner.text的基础类型为number | undefined。
你使用if (inner.text)作为判断条件,这种真值判断会把number类型的0、NaN也判定为不满足条件,类型检查器无法确定你是刻意排除假值数字,还是只是想排除undefined的情况。此外编辑器会做保守推断,认为inner作为引用类型,其属性可能在判断后被意外修改,导致之前的类型缩小结果失效,因此触发类型警告。
解决方法
- 方法1:调整判断条件,明确判断非undefined
直接对undefined做判断,避免真值判断对合法数字值的误判,同时让类型检查器明确分支内的属性类型一定为number:
该方法适用于允许0、NaN等假值数字进入分支的场景,是最稳妥的解决方案。public foo(inner: Partial<Inner>): void { let str = ''; if (inner.text !== undefined) { str += inner.text; } } - 方法2:将属性赋值给局部常量做判断
把inner.text提前赋值给不可变的局部常量,编辑器对常量的类型缩小推断不会受引用属性可变的影响,警告会自动消除:
该方法适用于你确实需要排除0、NaN等假值数字的场景。public foo(inner: Partial<Inner>): void { let str = ''; const text = inner.text; if (text) { str += text; } } - 方法3:使用非空断言
如果你能完全保证进入分支后inner.text一定不为undefined,可以在使用属性的位置添加!非空断言,告诉类型检查器跳过检查:
注意:该方法需要你自行保证运行时值的合法性,滥用可能导致运行时报错。public foo(inner: Partial<Inner>): void { let str = ''; if (inner.text) { str += inner.text!; } }
内容的提问来源于stack exchange,提问作者Larave
相关产品推荐
相关产品推荐

