启用tsc --strict选项后,已做undefined检查仍报TS2532错误
为什么TypeScript严格模式下检查了
input.query仍报错? 这是TypeScript严格模式里很常见的类型守卫失效场景,我来帮你理清楚问题根源和解决办法:
问题原因
你确实在if (input.query)里做了存在性检查,但TypeScript的静态分析无法跟踪到回调函数(这里是forEach的回调)执行时,input.query的状态仍然保持不变。虽然你的代码里没有修改它的逻辑,但TypeScript会假设在回调执行过程中,input.query有可能被外部代码修改为undefined,所以依然会抛出Object is possibly 'undefined'的错误。
解决方案
这里有几种靠谱的解决方式,你可以根据场景选择:
1. 将input.query赋值给局部变量(最推荐)
把input.query存到一个局部变量里,TypeScript能确定这个变量不会被外部修改,类型守卫的效果会一直保留到回调中:
function testStrict(input: {query?: {[prop: string]: string}}) { const query = input.query; if (query) { Object.keys(query).forEach(key => { query[key]; // 这里不会再报错 }) } return input; }
2. 使用可选链操作符
通过?.明确告诉TypeScript允许input.query为undefined,虽然有点冗余,但能快速解决报错:
function testStrict(input: {query?: {[prop: string]: string}}) { if (input.query) { Object.keys(input.query).forEach(key => { input.query?.[key]; }) } return input; }
3. 使用非空断言操作符
如果你能100%保证回调执行时input.query不会变成undefined,可以用!来强制告诉TypeScript这里的值非空:
function testStrict(input: {query?: {[prop: string]: string}}) { if (input.query) { Object.keys(input.query).forEach(key => { input.query![key]; }) } return input; }
注意:非空断言是开发者自己承担风险,TypeScript不会再做类型检查,所以如果后续代码有修改input.query的逻辑,这个方式就不安全了。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

