使属性变为可选
1type PartialByKeys<T, K extends keyof T> = {2 [P in K]?: T[P];3} & Pick<T, Exclude<keyof T, K>>;
使属性变为必填
1type RequiredByKeys<T, K extends keyof T> = {2 [P in K]-?: T[P];3} & Omit<T, K>;
判断类型是否是另一个类型的子类型
1type SubtypeOf<T, U> = T extends U ? true : false;
提取 interface 中非函数类型的名
1type NonFunctionPropertyNames<T> = {2 [K in keyof T]:T[K] extends Function ? never : K;3}[keyof T];
提取 interface 中非函数类型的属性
1type NonFunctionProperties<T> = Pick<T, NonFunctionPropertyNames<T>>;