# 8767-实现组合
# 题目描述
Given an array of strings, do Permutation & Combination. It's also useful for the prop types like video controlsList (opens new window)
// expected to be `"foo" | "bar" | "baz" | "foo bar" | "foo bar baz" | "foo baz" | "foo baz bar" | "bar foo" | "bar foo baz" | "bar baz" | "bar baz foo" | "baz foo" | "baz foo bar" | "baz bar" | "baz bar foo"`
type Keys = Combination<['foo', 'bar', 'baz']>;
# 分析
均借助了分发特性后,用非常简洁的代码实现了全排列和全组合。
其实之前的全组合,已经实现了本题目,只不过这题目少了一种情况,空字符。
想要实现组合,即使是用 js,也挺麻烦,但是借助 ts 联合类型的分发特性帮助了我们去做遍历,反而可以比较简单的实现这个题目。
# 题解
type Combination<
T extends string[],
// 将输入的元组转成联合类型
C = T[number],
// 保留原始的联合类型,因为分发后,就只表示自身了,想要 Exclude ,就必须保留原始的联合类型
K = C,
> =
// 触发分发特性,
K extends string
? // 此时 K 表示 元组中的某一个元素,将 K 加入结果中,同时递归剩余元素:Exclude<C, K> 即可
// 左侧的 K ,借助分发,产出了单个元素的所有结果,递归中的第一次分发,产出了所有的两个元素的结果,再次递归,产出了所有的3个元素的结果
K | `${K} ${Combination<[], Exclude<C, K>>}`
: // 永远走不到这个逻辑
'';