296 - Permutation
实现联合类型的全排列,将联合类型转换成所有可能的全排列数组的联合类型。
type perm = Permutation<'A' | 'B' | 'C'> // ['A', 'B', 'C'] | ['A', 'C', 'B'] | ['B', 'A', 'C'] | ['B', 'C', 'A'] | ['C', 'A', 'B'] | ['C', 'B', 'A']
Solution
type Permutation<T, K = T> = [T] extends [never]
? []
: K extends K
? [K, ...Permutation<Exclude<T, K>>]
: never
在 Permutation
类型定义中,新添加了一个泛型 K
等于 T
, 用于保留 T
的副本,达到排除联合类型中的某个元素的目的。
假设不添加 K
, 要遍历联合类型。通常要用 T extends T
。
T
是联合类型时, 假设 T = 'A' | 'B'
T extends T
会被拆分成
'A' extends 'A' | 'B' ? Condition : never
'B' extends 'A' | 'B' ? Condition : never
则 Condition
内部的 T
就变成了 'A'
或 'B'
, 导致无法拿到初始传入的 T
存储泛型 K
, 则意味着保留了一份 T
的复制。用 K
做 extends
判断, 此时在 Condition
内部的 T
仍是初始传入的 T
用 Exclude
即可排除联合类型中的某个元素