Skip to content

类型

ts
type _NonNullable<T> = T extends null | undefined ? never : T;
type A = 'number' | null | undefined;
type _NonNullableA = _NonNullable<A>; // number
ts
type _Parameters<T extends Function> = T extends (...args: infer K) => unknown
  ? K
  : never;
ts
type _ReturnType<T extends Function> = T extends (...args: any) => infer K
  ? K
  : never;
ts
type _Partial<T> = { [K in keyof T]?: T[K] };
ts
type _Readonly<T> = { readonly [K in keyof T]: T[K] };
ts
type _Pick<T, K extends keyof T> = { [P in K]: T[P] };
ts
type _Exclude<T, U> = T extends U ? never : T;

type H2 = _Exclude<'a' | 'b', 'c'>; // 'a' | 'b'
type H3 = _Exclude<'a' | 'b', 'b'>; // 'a'
ts
// 取交集
type _Extract<T, U> = T extends U ? T : never;

type I = _Extract<'a' | 'b', 'b' | 'c'>; // 'b'
type I1 = _Extract<'a' | 'b', 'c'>; // never
ts
interface IJ {
  a: null;
  b: number;
  c: string;
}
// Omit<T, U>从类型T中剔除U中的所有属性。
type _Omit<T, U extends keyof any> = { [P in _Exclude<keyof T, U>]: T[P] };
type _Omit1<T, U extends keyof any> = Pick<T, _Exclude<keyof T, U>>;

type J = _Omit<IJ, 'a'>; // {b: number; c: string}
type J1 = _Omit1<IJ, 'ac'>; // {a: null; b: number; c: string}