shfshanyue / Daily-Question

互联网大厂内推及大厂面经整理,并且每天一道面试题推送。每天五分钟,半年大厂中
https://q.shanyue.tech
4.92k stars 508 forks source link

【Q676】在 Typescript 中如何实现类型标记 Pick 与 Omit #695

Open shfshanyue opened 3 years ago

shfshanyue commented 3 years ago

有以下测试用例

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">
shfshanyue commented 3 years ago
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>>;
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">
Asarua commented 3 years ago
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]
}