如何提取 typescript mongoose/typegoose 模式

Posted

技术标签:

【中文标题】如何提取 typescript mongoose/typegoose 模式【英文标题】:How to extract typescript mongoose/typegoose schema 【发布时间】:2020-05-29 22:15:29 【问题描述】:

这里是一个声明的模式

class AccountSchema;

这里是一个声明的模型

const AccountClass: Model<AccountSchema & Document>;
class Account extends AccountClass;

为什么这不起作用?

type ExtractSchema<T extends Model<Document>> = T extends Model<infer D & Document> ? D : never;
class Service<T extends Model<ExtractSchema<T> & Document>> 
  public async getSchema(): ExtractSchema<T>;

class AccountService extends Service<typeof Account> 
  public test() 
   [ERROR: this.getSchema() returns never]
   this.getSchema()
  

使用泛型提取模式的最佳方法是什么?有没有什么方法可以不包含 javascript getter 和 setter 函数,只包含普通字段?

【问题讨论】:

【参考方案1】:

当你使用 typegoose 或 mongoose 时,以下应该可以工作

class Service<T extends Model<ExtractSchema<T> & Document>> 
  public async getSchema(): ExtractSchema<T> 
   return this.schema; 
  

this.schema 将在从文档调用函数时返回架构,否则您需要设置 static 字以使其成为静态函数(从模型中调用)

对于类型,你应该使用mongoose.Schema&lt;typeof YourClass&gt; 作为getSchema 的返回类型,否则返回类型将是一个模型(它不是在运行时)

【讨论】:

以上是关于如何提取 typescript mongoose/typegoose 模式的主要内容,如果未能解决你的问题,请参考以下文章

mongoose 和 typescript 如何自动将 '_id' 转换为 'id'?

如何在 NestJs 和 typescript 中使用 `mongoose-delete` 插件?

使用 TypeScript 时如何避免两次编写 Mongoose 的 Schema?

如何在 typescript 中使用 mongoose 在 mongodb 中插入数据?

如何使用 Mongoose 和 Typescript 实现强类型静态模式函数?

如何在 NodeJS、Mongoose 和 TypeScript 中使用日期和时间?