如何在TypeScript中定义Mongoose Query类型?
正确定义Mongoose Query类型的方案
先修正代码中的语法错误
你代码里的query: errorHere = query.populate(popOptions);是语法错误,赋值语句不需要额外加类型标注,应该改为:
if (popOptions) query = query.populate(popOptions);
为query变量添加正确的类型
Mongoose的findById方法返回的是Query类型,你需要从Mongoose中导入该类型,再根据场景定义泛型参数:
- 首先导入所需类型:
import { Model, Document, Query, ID } from 'mongoose'; import { RequestHandler, Request, Response, NextFunction } from 'express';
- 定义query的基础类型:
findById返回的基础Query类型可以直接定义为Query<T | null, T>,其中第一个泛型参数是查询执行后返回的文档类型,第二个是模型对应的原始文档类型:
const query: Query<T | null, T> = Model.findById(req.params.id);
当调用populate方法后,TypeScript会自动推导query的类型变为Query<PopulatedDoc<T> | null, T>,不需要手动修改类型定义——Mongoose的类型系统会自动识别填充操作带来的类型变化。
完整修正后的代码
import { Model, Document, Query, ID } from 'mongoose'; import { RequestHandler, Request, Response, NextFunction } from 'express'; // 假设catchAsync和DocType是你已定义的工具函数/自定义类型 import catchAsync from './your-catchasync-path'; type DocType<T> = Omit<T, '_id' | '__v'>; // 示例自定义类型,可根据实际情况调整 export const getOne = <T extends Document>(Model: Model<T>, popOptions?: string): RequestHandler => catchAsync(async (req: Request<{id: ID}>, res: Response, next: NextFunction) => { const query: Query<T | null, T> = Model.findById(req.params.id); if (popOptions) { query.populate(popOptions); } const doc = await query.exec() as DocType<T> | null; res.status(200).json({ status: 'success', data: { data: doc } }); });
关键说明
PopulatedDoc<T>是用来标记文档本身被填充后的类型,并非Query的类型,你之前误用它是混淆了Query类型和文档类型的概念。- Mongoose的
Query泛型参数设计可以自动追踪查询操作的类型变化,无需手动维护复杂的类型定义,保证类型推导的准确性。
内容的提问来源于stack exchange,提问作者Bibisoltan Rustamowa
相关产品推荐
相关产品推荐

