TypeScript 实现 omit、pick 方法

1,756 阅读1分钟

在实际的项目中,经常遇到从对象中摘取某些字段形成新对象的需求,对此小伙伴们想必也有自己的一套方法来实现。为了加深理解,记录下我自己的实现。

pick

// 从对象中选出相应字段,生成新对象
function pick<T extends Record<string,any>, P extends keyof T>(obj: T, args: P[]) {
  const newObj = {} as Pick<T, P>
  args.forEach((key) => {
    if (obj[key] !== undefined) newObj[key] = obj[key]
  })
  return newObj
}

omit

// 从对象中排除相应字段,生成新对象
function omit<T extends Record<string,any>, P extends keyof T>(obj: T, args: P[]) {
  const newObj = {} as Omit<T, P>
  // 这里的 includes 使用“item as P”,使前后类型一致
  const keys = Object.keys(obj).filter((item) => !args.includes(item as P)) as Exclude<keyof T, P>[]
  keys.forEach((key) => {
    if (obj[key] !== undefined) newObj[key] = obj[key]
  })
  return newObj
}