Typescript 类型检查具有混合类型和混合泛型的数组

Posted

技术标签:

【中文标题】Typescript 类型检查具有混合类型和混合泛型的数组【英文标题】:Typescript type check for an array with mixed types and mixed generics 【发布时间】:2021-12-15 20:21:46 【问题描述】:

我有以下设置

interface Animal<T> 
  name: string;
  makeNoise: () => T;


enum DogNoise 
  'bark',

class Dog implements Animal<DogNoise> 
  name: 'goodboy';
  makeNoise() 
    return DogNoise.bark;
  


enum CatNoise 
  'meow',
  'purr',

class Cat implements Animal<CatNoise> 
  name: 'needy';
  makeNoise() 
    return CatNoise.meow;
  


// what is the correct way to define generic for a mixed array
// knowing that other types of animals could be used (e.g. Cow) is using array the best approach to store them
const pets: Animal<any>[] = [new Cat(), new Dog()];

for (const pet of pets) 
  // now makeNoise returns any
  console.log(pet.makeNoise());

如何为animals 编写类型定义,使pet.makeNoise() 返回正确的类型? 这是否可以通过使用数组以外的东西来存储animals 来实现,或者这种解决问题的方法可能不是最好的? 谢谢!

【问题讨论】:

【参考方案1】:

您应该使用联合类型,如以下post

在你的情况下:

动物

【讨论】:

以上是关于Typescript 类型检查具有混合类型和混合泛型的数组的主要内容,如果未能解决你的问题,请参考以下文章

通过反射构造泛型(混合类型列表示例)

Typescript 从具有泛型类型的对象索引调用函数

TypeScript 中具有泛型类型参数的泛型类型的替代方案

带有泛型的 Typescript JSX - 参数隐式具有“任何”类型

Typescript - 确保泛型属性存在于具有描述性错误的泛型类型上

在 TypeScript 中为具有类型变量的抽象类中的派生类分配泛型类型