mongoose Typescript中有没有什么方法可以让泛型类继承在尖括号()之间的类的属性和方法< Class>

z0qdvdin  于 2023-06-23  发布在  Go
关注(0)|答案(1)|浏览(94)

我正在做一个后端项目,其中有多个实体共享两个属性iddescription。因此,我定义了一个基类来包含这些属性,并将其命名为BaseEntity

class BaseEntity {
   id: string | number;
   description: string;
}

我正在使用MongoDB数据库和Mongoose orm,因此我需要为模型和文档定义类型/接口。每个实体类型都有一个相关的文档类型,并且该文档类型将包含其相应实体类型的所有属性。定义文档类型的一种方法是为每个实体类型手动定义文档类型,另一种方法是(我觉得)定义一个通用的Document类型,该类型将作为实体类型之一的类型参数,并将继承其所有属性。我说的是这种事->

class DocumentType<ENTITY_TYPE extends BaseEntity> extends ENTITY_TYPE {
// additional properties
}

现在让我们假设存在两种类型的实体UserCountry,它们被定义如下:

class User extends BaseEntity {
   name: string;
   address: string;
   phoneNumber: number;
}

然后呢

class Country {
   population: string;
   code: string;
}

所以根据我的观点,类DocumentType<User>应该有属性id, description, name, address, phoneNumberDocumentType<Country>应该有属性id, description, population, code。有可能吗?mixin是唯一的选择。(我必须补充的是,第一种方法在几天前是有效的,我通过//@ts-ignore抑制了一个类型脚本警告,但现在它根本不起作用)

kupeojn6

kupeojn61#

据我所知你想要这样的东西

class Animal<T extends { [key: string]: boolean }> {
  constructor(private animal: T) {}

  // Accessor methods specific to the class type
  isAnimalType(type: keyof T): boolean {
    return this.animal[type];
  }
}

现在可以创建Animal类的示例,其中CatDog类作为泛型参数,如下所示:

const cat = new Animal<Cat>({ isCat: true });
console.log(cat.isAnimalType('isCat')); // Output: true

const dog = new Animal<Dog>({ isDog: true });
console.log(dog.isAnimalType('isDog')); // Output: true

相关问题