如何提取打字稿猫鼬/ typegoose模式

时间:2020-02-14 05:58:53

标签: typescript generics mongoose metaprogramming typegoose

这里是声明的模式

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 个答案:

答案 0 :(得分:0)

当您使用typegoose或mongoose时,以下方法应该起作用

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

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

关于类型,您应该使用mongoose.Schema<typeof YourClass>作为getSchema的返回类型,否则返回类型将是一个模型(在运行时不是)