高级泛型
1.Partial 此工具的作用是将泛型中的全部属性变成可选的
定义:
1 2 3 4
| type Partial<T> = { [P in keyof T]?: T[p] } //T是传入的泛型 P是泛型T中的属性名,T[P]则可获取到泛型T中属性名为P的属性值
|
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 例子: interface IUser { name: string age: number department: string } type optional = Partial<IUser>
// optional的结果如下 type optional = { name?: string | undefined; age?: number | undefined; department?: string | undefined; }
|
2. Pick<T,K>此工具的作用是将泛型T中的属性名为K的属性提取出来
定义:
1 2 3 4
| type Pick<T, K extends keyof T> = { [P in K]: T[P] } //K是泛型T的键名集合,P和K都是键名,P是K的一个子集
|
举例:
1 2 3 4 5 6 7 8 9 10 11 12
| interface IUser { name: string age: number department: string } type option = Pick<TUser, 'name'|'age'>
// optional的结果如下 type optional = { name: string age: number }
|
3.Readonly< T >,此工具的作用是将T泛型中的所有属性都变成只读类型(即不可以对属性重新赋值)
定义:
1 2 3
| type Readonly<T> = { readonly [P in keyof T]: T[P] }
|
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| interface IUser { name: string age: number department: string } type option = Readonly<TUser>
// optional的结果如下 type optional = { readonly name: string readonly age: number readonly department: string }
|
4. Exclude <T, U>此工具的作用是在T类型中有U类型就去掉
定义:
1 2 3 4 5
| type Exclude<T, U> = T extends U? never: T
我们这里用 MyTypes 也就是 ‘name’ | ‘age’ | ‘height’ 去代表 T 用 name 属性去代表第二个泛型 U T extends U 就判断是否’name’ | ‘age’ | ‘height’ 有 name, 有name就返回never,就代表将其排除
|
举例:
1 2 3 4 5
| MyTypes = ‘name’ | ‘age’ | ‘height’ type optionl = Exclude<MyTypes,'height'>
// optional的结果如下 type optional = ‘name’ | ‘age’
|
###增加小知识###
extends
可以用作继承,也可以用作条件类型,或者类型约束,具体取决于使用场景。
在 interface
和 class
上时,表示继承
1 2 3
| class Dog extends Animal{} // interface interface Dog extends Animal{}
|
在泛型中,可以用作类型约束,如下:
1 2 3 4
| / 这里约束 arg 必须有 length 属性 function log<T extends {length: number}>(arg: T):void{ console.log(arg.length) }
|
5.ReturnType< T> 获取泛型T的返回值类型
定义:
1 2 3 4 5 6
| type ReturnType<T extends (...arg: any) => any> = T extends ( ...arg: any ) => infer U ? U : never; //infer表示U是一个不确定的值
|
举例:
1 2 3 4 5 6 7 8
| const fn = (v: boolean) => { if (v) { return 1; } else { return 2; } }; type a = MyReturnType<typeof fn>; //type a = 1 | 2
|
6. Parameters获取函数参数的类型
定义:
1 2 3 4 5
| type Parameters<T extends (...args: any[]) => any> = T extends ( ...args: infer P ) => any ? P : never;
|
举例:
1 2 3 4 5
| function getUser(name: "string") { return { name: "xxx", age: 10 }; } type a = Parameters<typeof getUser>; //type a = [name: "string"]
|
7.Omit<T, K> 省略泛型T中属性名为K的属性
定义:
1 2 3
| type Omit<T, K extends string | number | symbol> = { [P in Exclude<keyof T, K>]: T[P]; };
|
举例:
1 2 3 4 5 6 7 8 9 10
| interface Todo { title: string; description: string; completed: boolean; }
type TodoPreview = Omit<Todo, "description" | "title">; //type TodoPreview = { completed: boolean; }
|