如何让TypeScript根据常量FLAG显式推断result为string类型?
解决方案
下面是几种能让result被TypeScript推断为string类型的可行方法:
方法一:用never类型消除else分支的类型影响
因为FLAG是恒为true的常量,else分支永远不会执行,我们可以把else分支的赋值断言为never,让TypeScript忽略该分支的类型:
const FLAG = true; let result; if (FLAG) { result = ""; } else { result = 1 as never; } // 此时result的类型被推断为string
方法二:使用条件类型显式约束result的类型
通过typeof FLAG获取常量的字面量类型,结合条件类型直接定义result的类型:
const FLAG = true; type ResultType = typeof FLAG extends true ? string : number; let result: ResultType; if (FLAG) { result = ""; } else { result = 1; } // ResultType会被解析为string,因此result的类型是string
方法三:利用字面量类型的控制流优化
const声明的true默认是true字面量类型,我们可以给result初始化为string类型,else分支用类型断言跳过:
const FLAG = true; let result = ""; if (!FLAG) { result = 1 as never; } // result的类型保持为string
内容的提问来源于stack exchange,提问作者4ntke
相关产品推荐
相关产品推荐

