Skip to content

在TypeScript中如何实现Pick与Omit

使用:

typescript
interface User {
  id: number;
  age: number;
  name: string;
}
 
// 相当于: type PickUser = { age: number; name: string; }
type OmitUser = Omit<User, "id">;
 
// 相当于: type PickUser = { id: number; age: number; }
type PickUser = Pick<User, "id" | "age">;

实现

第一种:

ts
type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};
 
type Exclude<T, U> = T extends U ? never : T;
 
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
typescript
interface User {
  id: number;
  age: number;
  name: string;
}
 
// 相当于: type PickUser = { age: number; name: string; }
type OmitUser = Omit<User, "id">;
 
// 相当于: type PickUser = { id: number; age: number; }
type PickUser = Pick<User, "id" | "age">;

第二种:

typescript
type MyPick<O extends object, K extends keyof O> = {
  [P in K]: O[P];
};
 
type MyOmit<O extends object, K extends keyof O> = MyPick<
  O,
  Exclude<keyof O, K>
>;
 
type MyOmit2<O extends object, K extends keyof O> = {
  [P in Exclude<keyof O, K>]: O[P];
};

前端知识体系 · wcrane