Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
简单
Push
type Mapping<T extends any[]> = {
[P in T[number]]: P
}
type Push<T extends readonly any[], U> = Mapping<T>[U] extends U ? T : [...T, U];
- 为数组创建一个类型映射对象
Mapping,key和value都是数组元素本身 - 这样就可以先判断元组中是否已经有该元素类型了没,然后再确定是否组装一个新的元组对象
Unshift
type Unshift<T extends ReadonlyArray<any>, U> = [U, ...T];
- 这个就跟
Push是一样的道理,就不多说啦
Parameters
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer P) => any ? P : never;
- 主要就是利用
extends和infer搭配使用,推断实际定义的类型
中等
获取函数返回类型
type MyReturnType<T extends (...arg: any[]) => any> = T extends (...arg: any[]) => infer R ? R : never;
- 跟
Parameters一样,反正只要是想获取函数类型使用时的一个实际类型,就得用extends+infer进行推导
实现 Omit
// 排除 T 类型中的 K 类型
type MyExclude<T, K> = T extends K ? never : T;
type MyOmit<T, K extends symbol | string | number> = {
[P in MyExclude<keyof T, K>]: T[P];
}
- 对象键的类型只能是
symbol | string | number MyExclude<keyof T, K>就是将K类型从T的键类型中进行剔除- 然后就进行常规的对象类型组装