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>
: false
type 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
中即可。