typescript的几项操作记录

165 阅读1分钟

利用联合类型过滤never类型

type Obj = {
  a: string
  b: string,
  c: number,
  d: boolean
}
 
// 提取部分字段
type GetKey<O, T> = {
  [K in keyof O]: O[K] extends T ? K : never
}[keyof O]

type Res = GetKey<Obj, string> // 'a' | 'b'

infer推测类型

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

const fn = () => 1

type FN = ReturnType<typeof fn> // number

部分转换key?: value

type MarkPropsAsOptional<
  T extends Record<string, any>,
  K extends keyof T = keyof T
> = Omit<T, K> & Partial<Pick<T, K>>;

获取交集、差异key

type Obj = Record<keyof any, any>

// 获取共同的key
type GetSomeKey<T extends Obj, U extends Obj> = Extract<keyof T, keyof U> &
  Extract<keyof U, keyof T>
  
// 获取T中不包含U的key
type GetDiffKey<T extends Obj, U extends Obj> = Exclude<keyof T, keyof U>

获取key的集合为常规操作,key获取到了,那么集合之间的差异也就引刃而解了,例如实现以新对象类型优先级更高的Merge 参考

type ObjectIntersection<
  T extends Obj,
  U extends Obj= Pick<TGetSomeKey<TU>>

type ObjectDifference<
  T extends Obj,
  U extends Obj= Pick<TGetDiffKey<TU>>

type Merge<
  T extends Obj,
  U extends Obj
  // T 比 U 多的部分,加上 T 与 U 交集的部分(类型不同则以 U 优先级更高,再加上 U 比 T 多的部分即可= ObjectDifference<TU> & ObjectIntersection<UT> & ObjectDifference<UT>