type-challenges:Unique

18 阅读1分钟

Unique

问题描述

实现类型版本的 Lodash.uniq 方法, Unique 接收数组类型 T, 返回去重后的数组类型.

type Res = Unique<[1, 1, 2, 2, 3, 3]>; // expected to be [1, 2, 3]
type Res1 = Unique<[1, 2, 3, 4, 4, 5, 6, 7]>; // expected to be [1, 2, 3, 4, 5, 6, 7]
type Res2 = Unique<[1, "a", 2, "b", 2, "a"]>; // expected to be [1, "a", 2, "b"]
type Res3 = Unique<[string, number, 1, "a", 1, string, 2, "b", 2, number]>; // expected to be [string, number, 1, "a", 2, "b"]
type Res4 = Unique<[unknown, unknown, any, any, never, never]>; // expected to be [unknown, any, never]
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'type cases = [
  Expect<Equal<Unique<[1, 1, 2, 2, 3, 3]>, [1, 2, 3]>>,
  Expect<Equal<Unique<[1, 2, 3, 4, 4, 5, 6, 7]>, [1, 2, 3, 4, 5, 6, 7]>>,
  Expect<Equal<Unique<[1, 'a', 2, 'b', 2, 'a']>, [1, 'a', 2, 'b']>>,
  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]>>,
]
​
​
// ============= Your Code Here =============
type Includes<T extends  any[], U> = T extends [infer P, ...infer R]
  ? Equal<U, P> extends true
    ? true
    : Includes<R, U>
  : falsetype Unique<T extends any[], A extends any[] = []> = T extends readonly [infer F, ...infer R]
  ? Includes<A,F> extends true
    ? Unique<R, A>
    : Unique<R, [...A, F]>
  : A
​

在之前我们实现过 Include 类型,它是用来判断一个元组中是否存在第二个泛型元素,观察发现实际上这就是去重。剩下的就简单了,我们只需要在依次判断每个元素是否在 A中,如果在则跳过,如果不在则将当前元素放入 A 中即可。