TypeScript条件返回类型失效:返回"yes"为何触发TSC类型错误?
问题原因与解决方案
报错原因
你当前写法里,返回类型的条件类型typeof flag extends true ? "yes" : "no"会被TypeScript直接求值,而非保留条件性。因为flag的类型是boolean,boolean extends true的判断结果为false,所以整个返回类型被固定为"no"——这就导致返回"yes"时触发类型不兼容的错误。
条件类型要实现“依赖传入参数类型”的效果,必须基于泛型参数,而非具体的基础类型(比如boolean)。
修正方案
方案1:泛型函数
将函数改为泛型,让flag的类型是受boolean约束的泛型参数,这样条件类型会根据传入的具体字面量类型(true或false)动态推断返回值类型:
const test = <T extends boolean>(flag: T): T extends true ? "yes" : "no" => { if (flag === true) { return "yes" as ReturnType<typeof test>; } else { return "no" as ReturnType<typeof test>; } }
这里的类型断言是因为TypeScript的控制流分析暂时无法完全匹配泛型条件类型,需要手动辅助确认类型。
方案2:函数重载
通过重载明确指定不同参数对应的返回类型,写法更直观:
function test(flag: true): "yes"; function test(flag: false): "no"; function test(flag: boolean): "yes" | "no" { if (flag === true) { return "yes"; } else { return "no"; } }
调用时,传入true会得到返回类型"yes",传入false会得到"no",完全符合预期。
内容的提问来源于stack exchange,提问作者John Goofy
相关产品推荐
相关产品推荐

