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-unique #309

Open utterances-bot opened 1 year ago

utterances-bot commented 1 year ago

Unique

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-unique.html

zhaoyao91 commented 1 year ago

The solution now fails the last two cases.

Expect<Equal<Unique<[string, number, 1, 'a', 1, string, 2, 'b', 2, number]>, [string, number, 1, 'a', 2, 'b']>>,
Expect<Equal<Unique<[unknown, unknown, any, any, never, never]>, [unknown, any, never]>>,

They must be added after your solution.

The newest solution would be like

type IsElemInSet<E, S extends unknown[]> = 
  S extends [infer Head, ...infer Rest extends unknown[]]
    ? Equal<E, Head> extends true
      ? true
      : IsElemInSet<E, Rest>
    : false

type Unique<T extends unknown[], Acc extends unknown[] = []> =
  T extends [infer First, ...infer Rest extends unknown[]]
    ? IsElemInSet<First, Acc> extends true
      ? Unique<Rest, Acc>
      : Unique<Rest, [...Acc, First]>
    : Acc

see issue