NestJs/Mongoose自增序列因类型检查失败,求解决方案
问题分析
报错根源是@types/mongoose-sequence的类型定义存在错误:
- 错误将
AutoIncrementFactory的参数类型限定为Schema,但实际该工厂函数支持传入mongoose实例或Connection对象 - 错误标记工厂函数返回值为
void,但实际应返回mongoose插件函数
以下是三种保留类型检查的解决方案:
方案1:传入mongoose实例(推荐)
直接导入mongoose模块实例传给工厂函数,完全符合类型预期:
import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; import { UserController } from './user.controller'; import { UserService } from './user.service'; import { User, UserSchema } from './schema/user.schema'; import * as AutoIncrementFactory from 'mongoose-sequence'; import mongoose from 'mongoose'; @Module({ imports: [ MongooseModule.forFeatureAsync([ { name: User.name, useFactory: async () => { const schema = UserSchema; const AutoIncrement = AutoIncrementFactory(mongoose); schema.plugin(AutoIncrement, { inc_field: 'users' }); return schema; }, }, ]), ], controllers: [UserController], providers: [UserService], exports: [UserService], }) export class UserModule {}
方案2:类型断言绕过错误检查
如果必须使用注入的Connection,通过类型断言跳过错误的类型校验,同时保留其他代码的类型检查:
import { Module } from '@nestjs/common'; import { MongooseModule, getConnectionToken } from '@nestjs/mongoose'; import { UserController } from './user.controller'; import { UserService } from './user.service'; import { User, UserSchema } from './schema/user.schema'; import * as AutoIncrementFactory from 'mongoose-sequence'; import { Connection, PluginFunction } from 'mongoose'; @Module({ imports: [ MongooseModule.forFeatureAsync([ { name: User.name, useFactory: async (connection: Connection) => { const schema = UserSchema; // 用类型断言修正参数和返回值类型 const AutoIncrement = AutoIncrementFactory(connection as any) as PluginFunction<User>; schema.plugin(AutoIncrement, { inc_field: 'users' }); return schema; }, inject: [getConnectionToken()], }, ]), ], controllers: [UserController], providers: [UserService], exports: [UserService], }) export class UserModule {}
方案3:自定义类型声明修复根源
在项目中添加自定义类型声明文件src/types/mongoose-sequence.d.ts,覆盖错误的官方类型定义:
declare module 'mongoose-sequence' { import mongoose, { Connection, PluginFunction } from 'mongoose'; type AutoIncrementFactory = (mongooseOrConnection: typeof mongoose | Connection) => PluginFunction<any>; const factory: AutoIncrementFactory; export = factory; }
添加后,你的原代码无需任何修改即可通过TypeScript类型检查。
内容的提问来源于stack exchange,提问作者cityvoice
相关产品推荐
相关产品推荐

