1、类型参数
实现经典的数据结构BinarySearchTree:
class Node<T> {
value : T;
left : Node<T>;
right : Node<T>;
}
Node<T>表示这个类可以接收单个参数T,这个参数在类中的某个地方会使用到。使用方法:
let numberNode = new Node<number>();
let stringNode = new Node<string>();
numberNode.right = new Node<number>();
numberNode.value = 42;
//Type "string" is not assignable to type "number"
numberNode.value = "42";
//Type Node<string> is not assignable to type Node<number>
numberNode.left = stringNode;
上述代码中我们创建了3个节点:numberNode、stringNode,以及另一个类型为Node<number>的节点,然后把这个节点实例赋给numberNode的右孩子。由于numberNode的类型是Node<number>,所以我们可以把它的值赋成42,但是不能是"42",左孩子同理。
在定义中我们明确声明了左右孩子的节点类型都是Node<number>,因此会得到第二个编译错误。
2、泛型函数
泛型的另一个典型用法就是用来定义一种可以操作一组类型的函数。如定义一个identity函数,它可以接受一个参数T,并且会返回它:
function identity<T>(arg: T) {
return arg;
}
3、多重泛型
ts允许使用多重泛型:
class Pair<K,V>{
key:K;
value:V;
}
用以下方式创建实例:
let pair = new Pair<string,number>();
pair.key = "foo";
pair.value = 42;