体操基础
// Partial<T>将T的所有属性变成可选的。 type Partial<T> = { [P in keyof T]?: T[P]; }// Exculde<T, U>排除联合类型T 中 属于U的类型 type Exculde<T, U> = T extends U ? never : T;type Require<T> = { [p in keyof T]-?: T[p]; }type Pick<T, K> = { [p in keyof K]: T[p]; }type Extract<T, U> = T extends U ? T : never;type Omit<T, K> = { [p in Exculde<keyof T, K>] : T[p]; } // 但是这里面还有一种更有意思的写法 值得注意的是这里 as 对 T 起到了收敛子集的作用 type Omit<T, K> = { [p in K as (T extends K ? never: T)] : T[p] } // 另外还有一种更长用的 type OmitV<T, K> = { [p in keyof T as (T[p] extends K ? p : never)]: T[p]; }type ReturnType<T extends (...arg: any) => any> = T extends (...arg:any) => infer R ? R : any;// 网上流行的版本 其中string做为特殊关键字参与了结构; type startWith<Prefix> = `${Prefix}${string}`; type a = '/as' type b = a extends startWith<'/'> ? true; false; // 自己实现的版本 type startWith<T, U extends string> = T extends `${U}${infer R}` ? true: false; type c = startWith<a, '/'>type EventType1 = { target: Element; } type EventType2 = { target: HTMLInputElement; } type EventFunctionMap = { type1: EventType1; type2: EventType2; } type EventList = keyof EventFunctionMap; type addEvent<T extends EventList> = ( type: T, listener: ( arg: EventFunctionMap[T], ) => void, ) => void; // 附上一个 不用映射类型的type OnlyBoolean = PickByType<{ name: string count: number isReadonly: boolean isEnable: boolean }, boolean> // { isReadonly: boolean; isEnable: boolean; } // 实现: type PickByType<T, U> = { [K in keyof T as T[K] extends U ? K : never]: T[K] }// Mutable 把所有的属性改为非只读,即去掉readonly 可以使用-操作符 type Mutable<T extends object> = { -readonly [K in keyof T]: T[K] }type Split<S extends string> = S extends `${infer F}${infer R}` ? [F, ...Split<R>] : [] type LengthOfString<S extends string> = Split<S>['length']
Last updated