Yuzhe's Blog

yuzhes

去除数组指定元素

去除数组指定元素

题目链接

题目

实现一个像 Lodash.without 函数一样的泛型 Without<T, U>,它接收数组类型的 T 和数字或数组类型的 U 为参数,会返回一个去除 U 中元素的数组 T。

例如:

type Res = Without<[1, 2], 1>; // expected to be [2]
type Res1 = Without<[1, 2, 4, 1, 5], [1, 2]>; // expected to be [4, 5]
type Res2 = Without<[2, 3, 2, 3, 2, 3, 2, 3], [2, 3]>; // expected to be []

解答

使用工具类型OmitReadonly

type MyReadonly2<T, K extends keyof T = keyof T> = 
  Omit<T, K> & Readonly<Pick<T, K>>;

这是不使用工具类型的写法,使用了as语法,分别划分需要设置为readonly和不需要设置为readonly的两类,分别把每类对应的不需要的属性名设置为never来删除他们。(如果不删除,在两个对象合并的时候会出问题)

在前面加readonly来指示属性只读。

type MyReadonly2<T, K extends keyof T = keyof T> = {
  readonly [key in keyof T as key extends K ? key : never]: T[key];
} & {
  [key in keyof T as key extends K ? never : key]: T[key];
}