1.定义
组件不仅能支持当前的数据类型,同时也能支持未来的数据类型。一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。
2.使用泛型
function identity<T>(arg: T): T {
return arg;
}
在定义了泛型之后,可以使用两种方式使用泛型。第一种,传入所有参数,包含类型参数。
const output = identity<string>("volit");
第二种,TypeScript引擎会根据传入的参数,自动推断T的类型。
const output = indentity("volit");
3.使用泛型变量
在通常情况下,如果我们要获取泛型元素上的属性,会提示警告信息,即该对象上没有没有该属性。比如说我们要获取对象的length属性,那我们可以将T声明为一个数组类型,这样就能顺利读取到length属性了。
function len<T>(arg: T[]):T[] { // 或者arg: Array<T>
console.log(arg.length);
return arg;
}
4.泛型类型
泛型类型和非泛型类型并未二致,只要参数的数量和结构能对的上就可以了。
function identity<T>(arg: T): T {
return arg;
}
const myIdentity: <T>(arg: T) => T = identity;
同样我们也可以定义泛型接口。
interface Identity {
<T>(arg: T): T;
}
/**
* 这样可以指定类型
interface Identity<T> {
(arg: T): T;
}
**/
function identity<T>(arg: T): T {
return arg;
}
const myIdentity: Identity = identity;
5.泛型类
和接口一样,直接把泛型类放在类后面,可以帮助我们确认类的所有属性都在使用相同的类型。
class Calculator<T> {
constructor(public count: T) {}
}
const calculator = new Calculator<number>(0);
ps.泛型只作用于类的实例部分,静态部分不能使用泛型类型
6.泛型约束
可以定义一个接口来描述约束条件,然后让泛型通过extends关键字继承。
interface Lengthwise {
length: number;
}
function len<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
7.在泛型里使用类类型
function create<T>(c: {new(): T; }): T {
return new c();
}