泛型
在定义函数接口类的时候不预先指定类型,而是在使用的时候指定类型
泛型函数
// 泛型变量T,在这个函数中就代表某一种类型,它可以是基础类型,也可以是联合类型等高级类型
const getArray = <T>(value: T, times = 5): T[] => {
return new Array(times).fill(value);
}
// 交换元组中两元素的位置
function swap<T, U>(tuple: [T, U]): [U, T] {
return [tuple[1], tuple[0]];
}
const result = swap(['string', 123]); // [123, 'string']
泛型接口
interface keyPair<T, U> {
key: T;
value: U;
}
let kp1 = keyPair<number, string> = { key: 123, value: 'str' };
let kp2 = keyPair<string, number> = { key: 'str', value: 123 };
泛型类
class Queue<T> {
private data = [];
push(item: T) {
return this.data.push(item);
}
pop(): T {
return this.data.shift();
}
}
const queue = new Queue<number>();
queue.push(1);
console.log(queue.pop().toFixed());
泛系约束
处理泛型数据的时候,不是所有类型都能做的操作不能做,不是所有类型都能调用的方法不能调用,但是在泛型中使用extends关键字就可以让传入值满足特定的约束条件
interface IWithLength {
length: number
}
function echoWithLength<T extends IWithLength>(arg: T): T {
cosole.log(arg.length)
return arg
}
const str = echoWithLength('str') // 正常
const number = echoWithLength(123) // 报错