TypeScript条件类型不符合预期:为何工具类型始终返回boolean?
问题
我写了一个工具类型:
type Equals<T, R> = T extends R ? (R extends T ? true : false) : false;
后来调研发现,由于any类型的存在,TypeScript中的双向可赋值性与类型相等性并非同一概念,于是将其更名为:
type MutualAssignable<T, R> = T extends R ? (R extends T ? true : false) : false;
但这仍未解决核心问题:这个工具类型始终返回boolean类型,而非预期的true或false。我在TS 4.4.4、4.6.4和4.8.4版本中测试过,结果一致,且测试中发现结果始终会包含true分支,不符合预期。
解答
这是因为TypeScript的条件类型在处理未具体化的泛型参数时,不会提前解析出具体的true或false,而是会保留条件分支的联合结果——也就是true | false,等价于boolean类型。
举几个实际测试的例子:
- 当传入明确的同类型:
type TestSame = MutualAssignable<number, number>,TypeScript能直接判定双向可赋值,结果为true; - 当传入明确的不同类型:
type TestDiff = MutualAssignable<number, string>,会直接返回false; - 但如果泛型参数是不确定的(比如在函数中定义
function check<T, R>(a: T, b: R): MutualAssignable<T, R> { ... }),TypeScript在编译阶段无法确定T和R的具体类型,只能把两个分支的结果合并,最终返回boolean。
你提到的any类型影响的是双向可赋值性的判定逻辑(比如MutualAssignable<any, string>会返回true),但这和返回boolean的情况无关——只有当泛型参数未被具体类型替换时,才会出现返回boolean的现象。
内容的提问来源于stack exchange,提问作者DUAN
相关产品推荐
相关产品推荐

