如何让TypeScript的KeyCombos支持任意联合类型的组合生成?
需求:让KeyCombos支持任意联合类型的组合生成
我目前有一段TypeScript代码,可以生成仅包含PropertyKey类型的联合类型组合:
type KeyCombos<T extends PropertyKey> = { [K in T]: [K] | (KeyCombos<Exclude<T, K>> extends infer U extends any[] ? U extends U ? [K | U[number]] : never : never); }[T];
这段代码依赖映射类型(仅允许属性键),所以仅支持PropertyKey联合。示例用法(用元组包裹避免类型简化):
type S = KeyCombos<"a" | "b" | "c">; // ^? ["a"] | ["b"] | ["c"] | ["b" | "c"] | ["a" | "b"] | ["a" | "c"] | ["a" | "b" | "c"] type N = KeyCombos<1 | 2 | 3>; // ^? [1] | [2] | [3] | [2 | 3] | [1 | 2] | [1 | 3] | [1 | 2 | 3]
我希望修改该类型以支持任意联合类型,但尝试两种分布式条件类型方案均失败:
- 方案1:
type KeyCombos<T extends PropertyKey> = T extends T ? [T] | (KeyCombos<Exclude<T, T>> extends infer U extends any[] ? U extends U ? [T | U[number]] : never : never) : never
问题:Exclude<T, T>会简化为never,最终仅得到单个元素的元组联合。
- 方案2:
type KeyCombos<T extends PropertyKey> = T extends infer K ? K extends K ? [K] | (KeyCombos<Exclude<T, K>> extends infer U extends any[] ? U extends U ? [K | U[number]] : never : never) : never : never
结果和方案1一致,无法实现需求。
现寻求修改方案,让KeyCombos支持任意联合类型的组合生成(无需处理元组排列,相关方案已掌握)。
内容的提问来源于stack exchange,提问作者k-tten
相关产品推荐
相关产品推荐

