【问题标题】:Array of generic classes泛型类数组
【发布时间】:2018-05-25 19:56:39
【问题描述】:

我有一家动物医院,里面有很多兽医,每个兽医都专攻一种特定的动物。

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 缺少它的泛型类型。为什么是这样?理论上,vets 数组中的每个 vet 可能会照顾不同类型的 Animal。作为医院,我所知道的是每个兽医都必须满足约束条件。

TypeScript playground

【问题讨论】:

    标签: arrays typescript generics types


    【解决方案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&lt;Dog&gt;,但由于我们使用 Vet&lt;Animal&gt;,我们也可以推送 Cat,这可能会导致运行时错误。

    【讨论】:

    • 好的,所以我可以只使用基类,因为无论如何将它们放入数组中都会丢失任何类型信息?
    • 在运行时类型信息无论如何都会丢失,在编译时,您可能会暴露自己的错误不会被检查器捕获,用示例更新答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多