Permutation
提出詳細
// ユニオン型に対してConditional typesを使うと、各要素を反復した結果のユニオンになる('a' | 'b' → 'A' | 'B'みたいな感じ) // Conditional typesを使って最初の要素を選んだとする。例えばAを選んだとして、再帰してみる。 // [A, ...Permutation<B, C>]で、Permutation<B, C>の戻り値が['B', 'C'] | ['C', 'B']だと、展開されて['A', 'B', 'C'] | ['A', 'C', 'B']になる // 残りから選んだ要素を除外するのが難しい。これは型パラメータを2つ取りつつ、片方は[T] extends [never]のようにしてユニオン型の条件分岐にならないようにするとできるみたい。 type Permutation<T, K = T> = [T] extends [never] ? [] : K extends any ? [K, ...Permutation<Exclude<T, K>>] : never;
提出日時 | 2023-08-11 09:42:50 |
---|---|
問題 | Permutation |
ユーザー | tekihei2317 |
ステータス | Accepted |
import type { Equal, Expect } from '@type-challenges/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<never>, []>>, ]