利用联合类型过滤never类型
type Obj = {
a: string
b: string,
c: number,
d: boolean
}
// 提取部分字段
type GetKey<O, T> = {
[K in keyof O]: O[K] extends T ? K : never
}[keyof O]
type Res = GetKey<Obj, string> // 'a' | 'b'
infer推测类型
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
const fn = () => 1
type FN = ReturnType<typeof fn> // number
部分转换key?: value
type MarkPropsAsOptional<
T extends Record<string, any>,
K extends keyof T = keyof T
> = Omit<T, K> & Partial<Pick<T, K>>;
获取交集、差异key
type Obj = Record<keyof any, any>
// 获取共同的key
type GetSomeKey<T extends Obj, U extends Obj> = Extract<keyof T, keyof U> &
Extract<keyof U, keyof T>
// 获取T中不包含U的key
type GetDiffKey<T extends Obj, U extends Obj> = Exclude<keyof T, keyof U>
获取key的集合为常规操作,key获取到了,那么集合之间的差异也就引刃而解了,例如实现以新对象类型优先级更高的Merge 参考
type ObjectIntersection<
T extends Obj,
U extends Obj
> = Pick<T, GetSomeKey<T, U>>
type ObjectDifference<
T extends Obj,
U extends Obj
> = Pick<T, GetDiffKey<T, U>>
type Merge<
T extends Obj,
U extends Obj
// T 比 U 多的部分,加上 T 与 U 交集的部分(类型不同则以 U 优先级更高,再加上 U 比 T 多的部分即可
> = ObjectDifference<T, U> & ObjectIntersection<U, T> & ObjectDifference<U, T>