能否使用TypeScript联合类型指定Mongoose Schema字段类型?
该写法不合法
你这段代码的核心问题是混淆了TypeScript编译时类型和Mongoose运行时Schema类型:
- TypeScript的
Result = string | number是仅用于静态代码检查的编译时类型别名,编译完成后会被完全擦除,运行时不存在这个值。 - Mongoose的Schema配置中,
type字段要求传入的是它能识别的运行时类型构造函数(比如String、Number、mongoose.Schema.Types.ObjectId等),而非TS的类型别名。你传入Result后,运行时Mongoose无法识别该参数,会直接抛出错误。
正确的写法
如果要让data字段同时支持字符串和数字类型,有两种常用方案:
方案1:指定多类型数组
直接在Schema的type中传入允许的类型构造函数数组,Mongoose会在运行时自动校验数据类型:
type Result = string | number; type ValueData = { data: Result; }; const valueDataSchema = new mongoose.Schema({ data: { type: [String, Number], // 运行时指定支持字符串/数字 required: true // 按需添加必填、默认值等其他校验规则 } });
方案2:使用Mixed类型
如果需要更灵活的类型支持,可以用mongoose.Schema.Types.Mixed(允许任意类型),同时通过TS类型约束编译时的类型范围:
type Result = string | number; type ValueData = { data: Result; }; const valueDataSchema = new mongoose.Schema({ data: mongoose.Schema.Types.Mixed });
注意:TS类型仅负责编译时的类型检查,不会影响Mongoose的运行时数据校验,需要同时保证Schema配置和TS类型的一致性。
内容的提问来源于stack exchange,提问作者BreenDeen
相关产品推荐
相关产品推荐

