1.理解TS中泛型的本质 其实TS中泛型的本质和js中函数的本质是一样的,JS中函数的本质:是一段推迟执行的,部分待定的代码,而TS中泛型的本质是:推迟执行的,部分待定的类型,也就是说:这个类型我在现在这个阶段是不知道的,具体是什么类型,只有等到实际使用的时候才能确定下来,也就是待定的类型;有此可见在类型系统中,泛型之于TS犹如函数之于JS一样重要. 2.泛型中 extends keyof的应用 type Person = { name: string } type LikeString = T extends string ? true :false (备注:这个在TS中被称为条件类型) type LikeNumber = T extends number ? 1:2 type LikePerson = T extends Person ? yes : no 就会得到如下的结果: type R1 = LikeString<'hi'> // true type R2 = LikeString // false type S1 = LikeNumber<6666> // 1 type S2 = LikeNumber // 2 type T1 = LikePerson<{ name: 'frank', xxx: 1 }>// yes type T2 = LikePerson<{ xxx: 1 }> // no
在这里,extends 可以理解为继承,也可以理解为包含在,在这里建议理解为包含于 ; T extends string ? true :false;这句话的意思是:如果T包含于string类型,就返回true,否则返回false 在泛型中,如果T为联合类型,则分开计算,怎么理解这句话呢,可以这样理解 假如:type LikePerson<A|B> = A|B extends Person ? yes : no 先是判断A extends Person 取得条件返回结果 然后再判断B extends Person 取得条件返回结果 总之在泛型中,如果需要用到条件表达式记住这两条规则就好: 规则1:如果T为never类型,则不进入表达式的计算,直接返回never; 规则2:如果T为联合类型,则分开计算
在泛型中keyof 的应用:keyof 其实就是获得一个类型中所有键的集合 一般结合in来使用:比如: type Person = { name: string, age: number } type GetKeys = keyof T type Result = GetKeys type GetKeyType<T, K extends keyof T> = T[K]
3.需要推到和记忆的泛型函数 type X1 = Readonly 给所有Person属性添加readonly,变为只读属性 type X2 = Partial 给所有Person属性添加?,变为可选属性 type X3 = Required给所有Person属性去掉?,变为必有属性 type X4 = Record<string, number>泛型的另外一种写法 type X5 = Exclude<1 | 2 | 3, 1 | 2> // 3 获得2个属性的非交集 type X6 = Extract<1 | 2 | 3, 2 | 4> // 2 获得2个类型的交集 type X7 = Omit<Person, 'name' | 'age'> 忽略掉Person类型中的name和age属性 type X8 = Pick<Person, 'age'>调出Person类型中的name和age属性 Omit的实现代码 type Omit<T, Key> = { [K2 in keyof T as (K2 extends Key ? never : K2)]: T }