You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:25:23