typescript之泛型

119 阅读1分钟

泛型

在定义函数接口类的时候不预先指定类型,而是在使用的时候指定类型

泛型函数
// 泛型变量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) // 报错