为何TypeScript允许boolean与undefined的无效比较?如何修改该行为?
TypeScript全等比较的类型检查差异问题
先看两段代码:
第一段代码,TypeScript允许布尔类型变量和undefined做全等比较:
const isItLanding = false; if (isItLanding === undefined) { // 合法,无报错 return ...; }
第二段代码,却会触发TypeScript报错:
const isItLanding = 1; if (isItLanding === 'undefined') { // 报错 return ...; }
为什么TypeScript不阻止第一段这种明显无效的比较?怎么修改配置让这类比较也触发报错?
我的TypeScript配置如下:
{ "compilerOptions": { "strict": true, "target": "esnext", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "importsNotUsedAsValues": "error", "allowSyntheticDefaultImports": true, "incremental": true, "tsBuildInfoFile": ".next/cache/.tscache/", "jsx": "preserve", "sourceMap": true, "baseUrl": ".", "paths": { "~/*": ["src/*"], "test-utils": ["./src/client/test-utils"] } }, "exclude": ["node_modules", "cypress"] }
原因解析
第一段代码不报错的原因:
TypeScript默认认为,布尔类型和undefined的跨类型比较,属于开发者可能有意编写的逻辑(比如变量后续可能被重新赋值为undefined,或者用来兼容其他可能返回undefined的场景)。虽然这段代码的运行结果一定是false,但TypeScript默认不会主动拦截这类跨基础类型的全等比较。第二段代码报错的原因:
这里是数字类型和字符串字面量'undefined'做比较,TypeScript能在编译阶段明确判断两者的全等比较结果永远是false——这种完全无意义的无效代码,TypeScript会直接抛出错误提示。
修改方法
在你的TypeScript配置的compilerOptions中添加"noUnusedCondition": true选项:
{ "compilerOptions": { // 原有配置... "noUnusedCondition": true }, // 原有exclude配置... }
启用这个选项后,TypeScript会检查所有条件表达式是否存在“永远为真/永远为假”的情况。第一段代码中isItLanding === undefined的结果永远是false,会被判定为无效条件,从而触发报错,和第二段代码的行为保持一致。
内容的提问来源于stack exchange,提问作者coolswood
相关产品推荐
相关产品推荐

