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']
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
type cases = [
Expect<Equal<Permutation<'A'>, ['A']>>,
Expect<
Equal<
Permutation<'A' | 'B' | 'C'>,
['A', 'B', 'C'] | ['A', 'C', 'B'] | ['B', 'A', 'C'] | ['B', 'C', 'A'] | ['C', 'A', 'B'] | ['C', 'B', 'A']
>
>,
Expect<
Equal<
Permutation<'B' | 'A' | 'C'>,
['A', 'B', 'C'] | ['A', 'C', 'B'] | ['B', 'A', 'C'] | ['B', 'C', 'A'] | ['C', 'A', 'B'] | ['C', 'B', 'A']
>
>,
Expect<Equal<Permutation<boolean>, [false, true] | [true, false]>>,
Expect<Equal<Permutation<never>, []>>
]
// ============= Your Code Here =============
// 答案
type Permutation<All, Item = All> = [All] extends [never]
? []
: Item extends All
? [Item, ...Permutation<Exclude<All, Item>>]
: never
废了,一点思路都没有,先记录下。
详细解析参考:
表格很重要
Iteration | T | K in K extends K | X<T, K> | [K, ...P<X<T, K>>] | Result |
---|---|---|---|---|---|
1 | 1 | 2 | 3 | 1 | 2 | 3 | [1, ...P<2 | 3>] | |
1.1 | 2 | 3 | 2 | 3 | [1, 2, ...P<3>] | |
1.1.1 | 3 | 3 | never | [1, 2, 3, ...[]] | [1, 2, 3] |
1.2 | 2 | 3 | 3 | 2 | [1, 3, ...P<2>] | |
1.2.1 | 2 | 2 | never | [1, 3, 2, ...[]] | [1, 3, 2] |
2 | 1 | 2 | 3 | 2 | 1 | 3 | [2, ...P<1 | 3>] | |
2.1 | 1 | 3 | 1 | 3 | [2, 1, ...P<3>] | |
2.1.1 | 3 | 3 | never | [2, 1, 3, ...[]] | [2, 1, 3] |
2.2 | 1 | 3 | 3 | 1 | [2, 3, ...P<1>] | |
2.2.1 | 1 | 1 | never | [2, 3, 1, ...[]] | [2, 3, 1] |
3 | 1 | 2 | 3 | 3 | 1 | 2 | [3, ...P<1 | 2>] | |
3.1 | 1 | 2 | 1 | 2 | [3, 1, ...P<2>] | |
3.1.1 | 2 | 2 | never | [3, 1, 2, ...[]] | [3, 1, 2] |
3.2 | 1 | 2 | 2 | 1 | [3, 2, ...P<1>] | |
3.2.1 | 1 | 1 | never | [3, 2, 1, ...[]] | [3, 2, 1] |