TypeScript学习二:泛型

159 阅读1分钟

泛型

const getArray = <T>(value: T, times: number = 5): T[] => {
  return new Array(times).fill(value);
};

console.log(getArray<number>(123, 4));
console.log(getArray<string>("abc", 4));

T: 类型变量

根据getArray调用时传入的类型作为T的类型

多个泛型

const fn1 = <T, U>(arg1: T, arg2: U, num: number = 5): Array<[T, U]> => {
  return new Array(num).fill([arg1, arg2]);
};
// 定义泛型类型
fn1<number, string>(12, "a1", 3);
// 可以不用定义泛型类型,ts会推断
fn1(1, "a", 3);

别名定义使用泛型

type Fn4 = <T>(arg1: T, arg2: number) => T[];
let fn4: Fn4 = (x: any, y: number) => [x, y];
console.log(fn4("aa", 123));

接口定义使用泛型

interface Fn5 {
  <T>(arg1: T, arg2: string): T[];
  name: string;
}

泛型约束

interface Len {
  length: number;
}
const fn6 = <T extends Len>(arg1: T, num: number): T[] => new Array(num).fill(arg1);
// fn6(123, 5); // 只能传入具有length属性的参数
fn6([1, 2, 3], 5);
fn6("abc", 5);