# 5360-unique

# 题目描述

实现类型版本的 Lodash.uniq 方法, Unique<T> 接收数组类型 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]

# 分析

要想去重,只需要遍历元组,并提供辅助元组,存储当前独一无二的元素,并在遍历元素时,先判断这个辅助元组中是否存在,如果存在,则忽略,否则,加入新元组并继续遍历。

其中判断元组中是否存在某个元素,可以通过 Includes 来进行。

# 题解

type MyEqual<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B
  ? 1
  : 2
  ? true
  : false;

type Includes<T extends readonly any[], U> = T extends [infer F, ...infer R]
  ? MyEqual<F, U> extends true
    ? true
    : Includes<R, U>
  : false;

type Unique<T extends any[], Res extends any[] = []> =
  // 遍历元组
  T extends [infer F, ...infer R]
    ? // 判断辅助元组中是否包含 F
      Includes<Res, F> extends true
      ? // 如果包含,直接遍历剩余元素
        Unique<R, Res>
      : // 不包含,则将当前元素放入结果,并在辅助元组中放入 F,然后递归剩余元素
        [F, ...Unique<R, [...Res, F]>]
    : [];

# 知识点

  1. 元组遍历套路
Last Updated: 2023/5/16 06:00:28