泛型类型参数联合是否等价于对应泛型类型的联合?
结论是否成立的说明
这个结论并非在所有情况下都成立,具体取决于WhateverType的实现方式:
成立的场景:分布式条件类型
当WhateverType是基于裸类型参数的分布式条件类型时,等式成立。TypeScript的条件类型会自动对联合类型的每个成员进行分发处理。
示例:
type WhateverType<T, D> = T extends string ? D : never; // 此时以下两个类型等价 type Result1 = WhateverType<string | number, boolean>; // boolean type Result2 = WhateverType<string, boolean> | WhateverType<number, boolean>; // boolean | never → boolean
不成立的场景:非分布式泛型
如果WhateverType的实现不属于分布式条件类型(比如参数被包裹在数组、对象或元组中,或是普通泛型结构),等式就不成立。
示例1:参数被包裹在元组中
type WhateverType<T, D> = [T, D]; // 两个结果完全不同 type Result1 = WhateverType<string | number, boolean>; // [string | number, boolean] type Result2 = WhateverType<string, boolean> | WhateverType<number, boolean>; // [string, boolean] | [number, boolean]
示例2:普通对象泛型
type WhateverType<T, D> = { value: T; data: D }; // 前者是单类型对象(value为联合类型),后者是对象的联合类型,两者不等价 type Result1 = WhateverType<string | number, boolean>; // { value: string | number; data: boolean } type Result2 = WhateverType<string, boolean> | WhateverType<number, boolean>; // { value: string; data: boolean } | { value: number; data: boolean }
内容的提问来源于stack exchange,提问作者user20508913
相关产品推荐
相关产品推荐

