TypeScript创建Mongoose模型静态方法时报找不到mongoose命名空间如何解决
报错原因
- 导入mongoose的方式为CommonJS的
require语法,TypeScript无法正确识别加载的模块类型,导致无法读取mongoose命名空间下的类型定义 - Mongoose v5及更早版本未内置TypeScript类型声明,若未安装对应的类型依赖包也会触发该报错
- 继承
mongoose.Model时未传入对应文档类型的泛型参数,类型校验不通过 - 调用
mongoose.model时未指定自定义模型的泛型,TypeScript无法识别新增的静态方法类型
解决方案
- 替换导入语法
将const mongoose = require('mongoose')替换为ES模块导入语法:
import mongoose from 'mongoose'
如果你的tsconfig.json中未开启esModuleInterop配置,可使用:
import * as mongoose from 'mongoose'
- 安装类型依赖(仅Mongoose v5及更早版本需要)
Mongoose v6+已内置完整TypeScript类型定义,无需额外安装。低版本用户执行以下命令安装类型依赖:
npm install @types/mongoose --save-dev
- 修正接口类型定义
将接口中大写的String改为TS基础类型string,同时为mongoose.Model传入文档属性泛型:
interface UserAttribs { email: string; password: string; } // 传入文档属性泛型,同时声明自定义静态方法 interface UserModel extends mongoose.Model<UserAttribs> { build(attribs: UserAttribs): User; }
- 调用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
相关产品推荐
相关产品推荐

