从泛型推断返回类型?

时间:2020-08-24 10:44:22

标签: typescript

以下方法可行,但是.getData()的返回类型为any,这不是理想的,因为这是消费者面部API调用。

实际上,这里的返回类型不是any,而是严格取决于items数组中保存的对象的类型。

反正我可以为这种方法的使用者提供返回类型吗?

class Group<T> {
  items: Array<T> = [];

  addItem(item: T) {
      this.items.push(item);
  }

  getData(itemIndex: number) {
    // Any is T
    return (this.items[itemIndex] as any).data;
  }
}

class NumberItem {
  data: number;

  constructor(data: number) {
      this.data = data;
  }
}

class StringItem {
  data: String = "";

  constructor(data: String) {
      this.data = data;
  }
}

let n1 = new NumberItem(3);
let n2 = new NumberItem(4);

let g1 = new Group<NumberItem>();
g1.addItem(n1);
g1.addItem(n2);

console.log(g1.getData(1));

https://www.typescriptlang.org/play?#code/MYGwhgzhAEDiBOB7ArgBwDwBUB80DeAsAFDTQCWALgKYC2EAXNAILzxgCeWuAvNANoBdANzFipMABMJASWo0AFJVqNMASnxjSWigAsyEAHRK6B1Mgg7Fc1SJLQAvqLsBzKhQAiYCmCu1pAOwkqAA9Gf2QaACMqeHVCO1IAekTmf3ZyGExNUng3ZHh-aHldfSM5CD5jAKDggWhIerTVAwkvMFtSRyIu4lBIGAA5COj4WVoNO1bvMOGY201gRH8ICnhkYApEeHkpsBmomLjs7T1DXeheXY6HYh6iPqhoAGVVsn9nMZoJ0l3GF-g3s4LtAAEQg+Z2RbLVbrTbbX7PV7vI4JE6lc6XNrXLp3EBuaD+ACMwP8VAA7tAhgdRnJ5ABmGzEPEUAkAJhJ5MpsxptHkABZGUQmfjnMTeKSKQgUBgqSNPth5ILRQZJDJaUSlYSVVJPvJ-KzBb0lhBEHiDCBEM55MrXB42vJCapDUQgA

1 个答案:

答案 0 :(得分:3)

赋予T一个上限,使其具有data属性,则返回类型为T['data']。这样,在getData方法内也不需要类型声明。

class Group<T extends { data: any }> {
  items: Array<T> = [];

  addItem(item: T) {
    this.items.push(item);
  }

  getData(itemIndex: number): T['data'] {
    return this.items[itemIndex].data;
  }
}

用法:

let n1 = new NumberItem(3);
let n2 = new NumberItem(4);

let g1 = new Group<NumberItem>();
g1.addItem(n1);
g1.addItem(n2);

// result: number
const result = g1.getData(1);