使用SWC编译NestJS+MongoDB时枚举Schema配置报错
NestJS + MongoDB 使用SWC编译时枚举类型Schema报错问题
问题现象
使用SWC编译器编译NestJS结合MongoDB的项目时,出现Schema配置错误,不使用SWC编译则一切正常。
报错信息
TypeError: Invalid schema configuration:
adminis not a valid type at pathADMIN.
代码示例
枚举定义
export enum Role { ADMIN = 'admin', SALES = 'sales', MARKETING = 'marketing', }
User Schema代码
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import { Document } from 'mongoose'; import { Role } from '../../../enum/role'; @Schema({ timestamps: true }) export class User { @Prop({ required: true, default: null }) email: string; @Prop({ required: true, default: null }) password: string; @Prop({ required: true, enum: Role, default: Role.ADMIN }) role: Role; } export const UserSchema = SchemaFactory.createForClass(User); export type UserDocument = User & Document;
临时规避方式
将role的类型从Role改为string后,报错即可消失:
@Prop({ required: true, enum: Role, default: Role.ADMIN }) role: string;
额外现象
报错信息会显示枚举第一个元素的值,例如将SALES移至枚举首位时,报错内容变为sales。
SWC配置
通过npm i --save-dev @swc/cli @swc/core安装SWC,nest-cli.json配置如下:
{ "$schema": "https://json.schemastore.org/nest-cli", "collection": "@nestjs/schematics", "sourceRoot": "src", "compilerOptions": { "deleteOutDir": true, "builder": "swc", "typeCheck": true } }
解决方案
原因分析
SWC对TypeScript字符串枚举的编译逻辑与tsc不同,SWC编译后的枚举对象结构无法被NestJS的SchemaFactory正确识别,导致将枚举值误判为字段类型。
解决方法1:显式传入枚举值数组
在@Prop装饰器中,将enum参数改为枚举的取值数组,而非直接传递枚举对象:
@Prop({ required: true, enum: Object.values(Role), default: Role.ADMIN }) role: Role;
解决方法2:调整SWC枚举编译配置
在项目根目录创建.swcrc文件,配置SWC以保留与tsc一致的枚举编译结构:
{ "jsc": { "transform": { "legacyDecorator": true, "decoratorMetadata": true }, "parser": { "syntax": "typescript", "decorators": true }, "target": "es2021", "enum": { "preserveConstEnums": true, "enumRuntime": true } } }
该配置会让SWC编译枚举时保留原始的键值对结构,确保SchemaFactory能正确解析枚举类型。
内容的提问来源于stack exchange,提问作者M Nouman
相关产品推荐
相关产品推荐

