ghaiklor / type-challenges-solutions

Solutions for the collection of TypeScript type challenges with explanations
https://ghaiklor.github.io/type-challenges-solutions/
Creative Commons Attribution 4.0 International
470 stars 56 forks source link

type-challenges-solutions/en/medium-nomiwase #308

Open utterances-bot opened 1 year ago

utterances-bot commented 1 year ago

AllCombinations

This project is aimed at helping you better understand how the type system works, writing your own utilities, or just having fun with the challenges.

https://ghaiklor.github.io/type-challenges-solutions/en/medium-nomiwase.html

zhaoyao91 commented 1 year ago

Here is my solution without String2Union, welcome disscussion and improvement :)

issue with explanation

code snippet:

type Head<T extends string> = T extends `${infer First}${any}` ? First : never
type AllCombinations<S extends string, C extends string = ''> = 
  S extends '' ? '' :
  C extends ''
    ? AllCombinations<S, Head<S>>
    : S extends `${infer Left}${C}${infer Right}`
      ? AllCombinations<`${Left}${Right}`>
        | `${C}${AllCombinations<`${Left}${Right}`>}`
        | AllCombinations<S, Head<Right>>
      : never