1

这里是一个声明的模式

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 函数,而只是简单的字段?

4

1 回答 1

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否则返回类型将是模型(在运行时不是模型)

于 2020-03-03T16:02:19.553 回答