去除数组指定元素
Less than 1 minuteTC-Medium
去除数组指定元素
题目
实现一个像 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 []
解答
使用工具类型Omit
和Readonly
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];
}