泛型T
T 是一个抽象类型,只有在调用的时候才确定它的值
function identity<T>(arg: T): T {
return arg;
}
其中 T
代表 Type,在定义泛型时通常用作第一个类型变量名称。但实际上 T
可以用任何有效名称代替。
常见泛型变量:
- K(Key):表示对象中的键类型;
- V(Value):表示对象中的值类型;
- E(Element):表示元素类型。
泛型约束
T 类型并使用 extends
关键字约束该类型
//对使用的泛型进行约束,我们约束其为具有length属性的类型
interface Len {
length:number
}
function getLegnth<T extends Len>(arg:T) {
return arg.length
}
getLegnth<string>('123')
泛型工具
1、typeof
typeof 的主要用途是在类型上下文中获取变量或者属性的类型
interface Person {
name: string;
age: number;
}
const kk: Person = { name: "semlinker", age: 30 };
//通过 typeof 操作符获取 kk 变量的类型并赋值给 Sem 类型变量,之后我们就可以使用 Sem 类型
type Sem = typeof kk; // type Sem = Person
const joy: Sem = { name: "joy", age: 5 }
2、keyof
keyof
操作符是在 TypeScript 2.1 版本引入的,该操作符可以用于获取某种类型的所有键,其返回类型是联合类型
首先定义了 T 类型并使用 extends
关键字约束该类型必须是 object 类型的子类型,然后使用 keyof
操作符获取 T 类型的所有键,其返回类型是联合类型,最后利用 extends
关键字约束 K 类型必须为 keyof T
联合类型的子类型。
type Todo = {
id: number;
text: string;
done: boolean;
}
const todo: Todo = {
id: 1,
text: "Learn TypeScript keyof",
done: false
}
function prop<T extends object, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
const id = prop(todo, "id"); // const id: number
const text = prop(todo, "text"); // const text: string
const done = prop(todo, "done"); // const done: boolean
3、in
in
用来遍历枚举类型
4、infer
infer就是推导泛型参数
infer声明只能出现在extends子语句中