21220 - Permutations of Tuple
给定一个通用的元组类型 T extends unknown[], 编写一个类型,将 T 的所有排列组合作为联合类型生成。
Solution
type PermutationsOfTuple<T extends unknown[]> = T extends [
infer F,
...infer R,
infer L
]
?
| [F, ...PermutationsOfTuple<R>, L]
| [F, L, ...PermutationsOfTuple<R>]
| [L, ...PermutationsOfTuple<R>, F]
| [L, F, ...PermutationsOfTuple<R>]
| [...PermutationsOfTuple<R>, F, L]
| [...PermutationsOfTuple<R>, L, F]
: T
在之前的排列组合的题目中
都是通过将原始类型 T 直接或间接转换为联合类型, 再通过 Exclude 排除某个元素来实现结果。
但在该题中, 是无法将 T 转换成联合类型的。这是因为输入数组中存在一些特殊类型。例如:
[any, unknown, never] 转换成联合类型
type C = any | unknwon | never
C 的最终类型是 any。
再比如 [1, number] 转换成联合类型
type C = 1 | number
C 的最终类型是 number
所以将 T 转成联合类型无法实现排列组合。
因此尝试将数组 T 分为三部分:
- 首元素
F - 中间元素数组
R - 最后元素
L
这三个元素的排列组合结果有6种, 因此只需要写出6种组合就能实现排列组合的目的。