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

TypeScript创建Mongoose模型静态方法时报找不到mongoose命名空间如何解决

报错原因
  • 导入mongoose的方式为CommonJS的require语法,TypeScript无法正确识别加载的模块类型,导致无法读取mongoose命名空间下的类型定义
  • Mongoose v5及更早版本未内置TypeScript类型声明,若未安装对应的类型依赖包也会触发该报错
  • 继承mongoose.Model时未传入对应文档类型的泛型参数,类型校验不通过
  • 调用mongoose.model时未指定自定义模型的泛型,TypeScript无法识别新增的静态方法类型
解决方案
  1. 替换导入语法
    将const mongoose = require('mongoose')替换为ES模块导入语法:
import mongoose from 'mongoose'

如果你的tsconfig.json中未开启esModuleInterop配置,可使用:

import * as mongoose from 'mongoose'
  1. 安装类型依赖(仅Mongoose v5及更早版本需要)
    Mongoose v6+已内置完整TypeScript类型定义,无需额外安装。低版本用户执行以下命令安装类型依赖:
npm install @types/mongoose --save-dev
  1. 修正接口类型定义
    将接口中大写的String改为TS基础类型string,同时为mongoose.Model传入文档属性泛型:
interface UserAttribs {
  email: string;
  password: string;
}

// 传入文档属性泛型,同时声明自定义静态方法
interface UserModel extends mongoose.Model<UserAttribs> {
  build(attribs: UserAttribs): User;
}
  1. 调用model方法时指定泛型
    将mongoose.model的返回值指定为你自定义的UserModel类型,让TS识别新增的静态方法:
const User = mongoose.model<UserAttribs, UserModel>('User', userSchema);

完整修正后代码

import mongoose from 'mongoose';

interface UserAttribs{
  email: string;
  password: string;
}

interface UserModel extends mongoose.Model<UserAttribs>{
  build(attribs: UserAttribs): User;
}

const userSchema = new mongoose.Schema({
  email:{
    type: String,
    required: true
  },    
  password:{
    type: String,
    required: true
  }    
});

userSchema.statics.build = (attribs: UserAttribs) => {
  return new User(attribs);
}

const User = mongoose.model<UserAttribs, UserModel>('User', userSchema);

export { User };

内容的提问来源于stack exchange,提问作者Pinakin Chaubal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:36:03