Mongoose6下Typegoose从模型类获取DocumentType实例的正确方法
问题解答
1. 现象底层逻辑
该差异是TypeScript静态类型推断的结果,运行时A和B本质都是Mongoose的Document实例,仅静态类型展示有区别:
@typegoose/typegoose适配Mongoose 6之后,对getModelForClass返回的模型构造函数做了多重载类型定义,其中优先级最高的重载规则为:当入参为自定义类(此处为Product)的实例时,返回类型直接匹配入参的实例类型,也就是普通Product类型。- 当你用
{...product}解构后,生成的是无类继承的纯POJO对象,不匹配上述最高优先级的重载,会降级匹配「入参为普通对象、返回DocumentType类型」的重载,所以推断出来的B是DocumentType类型。
2. 获取DocumentType实例的正确方式
有几种常用方案:
- 构造时传入纯POJO对象,避免直接传入自定义类的实例,就是你示例中
B的写法 - 显式做类型断言:
import type { DocumentType } from "@typegoose/typegoose"; const A = new ProductModel(product) as DocumentType<Product>;
- 先把类实例转成纯对象再传入:
const A = new ProductModel(product.toObject());
- 调用模型的
create方法创建实例,返回结果默认就是DocumentType类型:
const doc = await ProductModel.create(product);
3. 文档检索提示
你可以用以下关键词检索相关内容:
- Mongoose官方文档检索关键词:
Mongoose 6 TypeScript Model constructor、Mongoose DocumentType type inference、Mongoose TypeScript Support - Typegoose相关检索关键词:
typegoose getModelForClass constructor type、typegoose DocumentType return type
相关内容可在Mongoose官方文档的TypeScript支持章节,以及Typegoose官方文档的类型定义、模型创建相关板块找到。
内容的提问来源于stack exchange,提问作者minjae kim
相关产品推荐
相关产品推荐

