type-challenges:Combination

20 阅读1分钟

Combination

问题描述

给定一个字符串数组,执行排列和组合。也支持 controlsList 这样的工具类型。

// expected to be `"foo" | "bar" | "baz" | "foo bar" | "foo bar baz" | "foo baz" | "foo baz bar" | "bar foo" | "bar foo baz" | "bar baz" | "bar baz foo" | "baz foo" | "baz foo bar" | "baz bar" | "baz bar foo"`
type Keys = Combination<['foo', 'bar', 'baz']>
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'type cases = [
  Expect<Equal<Combination<['foo', 'bar', 'baz']>,
  'foo' | 'bar' | 'baz' | 'foo bar' | 'foo bar baz' | 'foo baz' | 'foo baz bar' | 'bar foo' | 'bar foo baz' | 'bar baz' | 'bar baz foo' | 'baz foo' | 'baz foo bar' | 'baz bar' | 'baz bar foo'>>,
]
​
​
// ============= Your Code Here =============
// 答案
// type Combination<T extends string[], A = T[number], U = A> = 
//   U extends infer I extends string
//     ? I | `${I} ${Combination<[], Exclude<A, I>>}`
//   : never
  
​
​
type Combination<T extends string[], I = T[number]> = I extends string
? I | `${I} ${Combination<[Exclude<T[number], I>]>}`
  : never