You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中定义Mongoose Query类型?

正确定义Mongoose Query类型的方案

先修正代码中的语法错误

你代码里的query: errorHere = query.populate(popOptions);是语法错误,赋值语句不需要额外加类型标注,应该改为:

if (popOptions) query = query.populate(popOptions);

为query变量添加正确的类型

Mongoose的findById方法返回的是Query类型,你需要从Mongoose中导入该类型,再根据场景定义泛型参数:

  1. 首先导入所需类型:
import { Model, Document, Query, ID } from 'mongoose';
import { RequestHandler, Request, Response, NextFunction } from 'express';
  1. 定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 18:37:21