Skip to content

实现Omit

typescript
type MyPick<T, K extends keyof T> = {
  [Key in K]: T[Key];
};

// 如果联合类型使用了 extends,它就会被打散,变成多个独立的类型进行判断,最后再组合起来。
type MyExclude<T, U> = T extends U ? never : T;

type MyOmit<T, K extends keyof T> = MyPick<T, MyExclude<keyof T, K>>;

interface Example {
  a: number;
  b: string;
  c: boolean;
}

type ExampleOmitted = MyOmit<Example, 'b'>;

方案二

使用了TS4.1新增的 Key Remapping via as 特性

typescript
type MyOmit<T,K extends keyof T> = {
   [Key in keyof T as Key extends K ? never : Key] : T[Key]
}

函数相关

typescript
// 提取函数参数类型
type GetParameters<T extends Function> = T extends (...args: infer Args) => any ? Args : never;

// 提取函数返回值
type GetReturnType<T extends Function> = T extends (...args: any) => infer returnType ? returnType : never;