通用类的数组

时间:2017-12-12 07:37:15

标签: arrays typescript generics types

我有一个动物医院,有一系列兽医,每个兽医专门研究一个特定的动物。

interface Animal {}

class Dog implements Animal {}
class Cat implements Animal {}

class Vet<T extends Animal> {
  waitingList: T[];
}

class Hospital {
  vets: Vet[]
}

我收到TypeScript 2.6的错误,因为Hospital.vets缺少它的通用类型。为什么是这样?理论上,兽医阵列中的每个兽医都可能会照顾不同类型的动物。作为一个医院,我所知道的是每个兽医必须满足约束。

TypeScript playground

1 个答案:

答案 0 :(得分:1)

您需要指定数组项的泛型参数。您可以使用基类Animal

interface Animal {}

class Dog implements Animal { }
class Cat implements Animal { }

class Vet<T extends Animal> {
    waitingList: T[];
}

class Hospital {
    vets: Vet<Animal>[] = [ new Vet<Dog>(), new Vet<Cat>() ]
}

只是一句警告,取决于你如何使用它,它可能会让一些错误通过类型检查器:

new Hospital().vets[0].waitingList.push(new Cat())

在上面的示例中,new Hospital().vets[0]Vet<Dog>,但由于我们使用Vet<Animal>,因此我们也可以推送Cat,这可能会导致运行时错误。