TypeScript学习笔记系列四(泛型)

295 阅读1分钟

思维导图

定义:把类型作为一个特殊的参数传进去

泛型类
class EagleChinaWu<T> {
  private value: T;

  getValue(): T {
    return this.value;
  }

  setValue(value: T) {
    this.value = value;
  }
}

// <T>省略,将进行推断
let ecw = new EagleChinaWu<string>();
ecw.setValue('WeChat');

// // 错误示例
// let ecwStr:number = ecw.getValue();
泛型函数
function EagleChinaWu<T>(arg: T): T {
  return arg;
}

// // 错误示例
// let ecw: number = EagleChinaWu('WeChat');

// 正确示例
let ecw: string = EagleChinaWu('WeChat');
function concatArr<T>(...arg: T[][]): T[] {
  let result: T[] = [];

  arg.forEach(item => {
    result = result.concat(item);
  });

  return result;
}

// ecw => [ 'Eagle', 'China', 'Wu' ]
let ecw = concatArr<string>(
  ['Eagle'], ['China'], ['Wu']
);
console.log(ecw);
泛型构造器
class EagleChinaWu<T> {
  private ecw: T;

  constructor(ecw: T) {
    this.ecw = ecw;
  }

  show() {
    console.log(this.ecw);
  }
}

let ecw = new EagleChinaWu('WeChat');
泛型extends:限定范围
// T不是具备了Date的属性/函数,而是T的范围只能是Date或者Date的派生类
class EagleChinaWu<T extends Date> {
  private ecw: T;

  constructor(ecw: T) {
    this.ecw = ecw;
  }

  show() {
    console.log(this.ecw);
  }
}

// 派生类
class ForkDate extends Date { }

let ecw = new EagleChinaWu(new Date());

let ecw2 = new EagleChinaWu(new ForkDate());