type Partial<T> = {
[P in keyof T]?: T[P] | undefined
}
type Required<T> = {
[P in keyof T]-?: T[P]
}
type Readonly<T> = {
readonly [P in keyof T]: T[P]
}
type Record<K extends string | number | symbol, T> = {
[P in K]: T
}
type Pick<T, K extends keyof T> = {
[P in K]: T[P]
}
type Omit<T, K extends string | number | symbol> = {
[P in Exclude<keyof T, K>]: T[P]
}
// 差集:T中有而U中没有的,T排除U
type Exclude<T, U> = T extends U ? never : T
// 交集:T和U都有的
type Extract<T, U> = T extends U ? T : never
这里的具体实现其实就是条件类型的分布式特性,即当 T、U 都是联合类型(视为一个集合)时,T 的成员会依次被拿出来进行 extends U ? T1 : T2 的计算,然后将最终的结果再合并成联合类型。
而并集就是联合类型
type FunctionType = (...args: any) => any
type Parameters<T extends FunctionType> = T extends (...args: infer P) => any
? P
: never
type ReturnType<T extends FunctionType> = T extends (...args: any) => infer R
? R
: any