TypeScript类型体操挑战(三)

166 阅读1分钟

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];
  • 为数组创建一个类型映射对象Mappingkeyvalue都是数组元素本身
  • 这样就可以先判断元组中是否已经有该元素类型了没,然后再确定是否组装一个新的元组对象

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;
  • 主要就是利用extendsinfer搭配使用,推断实际定义的类型

中等

获取函数返回类型

挑战要求

在线示例

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的键类型中进行剔除
  • 然后就进行常规的对象类型组装