type-challenges:Permutation

17 阅读1分钟

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

废了,一点思路都没有,先记录下。

详细解析参考:

表格很重要

IterationTK in K extends KX<T, K>[K, ...P<X<T, K>>]Result
11 | 2 | 312 | 3[1, ...P<2 | 3>]
1.12 | 323[1, 2, ...P<3>]
1.1.133never[1, 2, 3, ...[]][1, 2, 3]
1.22 | 332[1, 3, ...P<2>]
1.2.122never[1, 3, 2, ...[]][1, 3, 2]
21 | 2 | 321 | 3[2, ...P<1 | 3>]
2.11 | 313[2, 1, ...P<3>]
2.1.133never[2, 1, 3, ...[]][2, 1, 3]
2.21 | 331[2, 3, ...P<1>]
2.2.111never[2, 3, 1, ...[]][2, 3, 1]
31 | 2 | 331 | 2[3, ...P<1 | 2>]
3.11 | 212[3, 1, ...P<2>]
3.1.122never[3, 1, 2, ...[]][3, 1, 2]
3.21 | 221[3, 2, ...P<1>]
3.2.111never[3, 2, 1, ...[]][3, 2, 1]