如何让TypeScript对Mongoose查询的无效字段编译报错?
如何让TypeScript在Mongoose查询包含无效字段时阻止编译?
给定如下Mongoose Schema和Model:
const personSchema = new mongoose.Schema({ name: { type: String, required: true }, age: { type: Number, required: true }, }) const person = mongoose.model('PersonCollection', personSchema);
当编写包含不存在字段的查询(比如person.find({ randomProperty: 123 }))时,希望TypeScript能直接在编译阶段报错提示该字段无效。
已知Mongoose 7+中strictQuery默认值为false,允许这类未知属性查询,但希望通过TypeScript的类型检查来拦截这类错误。当前已启用Mongoose自动类型推断,且tsconfig中"strict": true。
版本信息:
- Mongoose 8.4.0
- MongoDB 6.0
- TypeScript 5.4.2
解决方案
要实现编译时拦截无效查询字段的需求,可通过以下方式配置:
显式用类型约束查询参数
利用Mongoose的InferSchemaType导出文档类型,再通过FilterQuery工具类型强制查询对象匹配Schema结构:import mongoose, { FilterQuery } from 'mongoose'; const personSchema = new mongoose.Schema({ name: { type: String, required: true }, age: { type: Number, required: true }, }); // 导出Schema对应的文档类型 type Person = mongoose.InferSchemaType<typeof personSchema>; // 创建Model时指定泛型类型 const PersonModel = mongoose.model<Person>('PersonCollection', personSchema); // 显式指定查询参数类型为FilterQuery<Person> const invalidQuery: FilterQuery<Person> = { randomProperty: 123 }; // TypeScript立即报错:类型“{ randomProperty: number; }”不能赋值给类型“FilterQuery<Person>” PersonModel.find(invalidQuery);这样只要查询中出现Schema未定义的字段,TypeScript就会在编译阶段抛出错误。
开启Mongoose运行时严格检查(可选)
配合编译时检查,可开启Mongoose的strictQuery和strict选项,在运行时也拦截无效查询:// 在连接数据库前配置 mongoose.set('strict', 'throw'); mongoose.set('strictQuery', true);双重保障能彻底避免无效字段的查询请求。
确认tsconfig严格模式配置
确保tsconfig.json中严格类型检查选项已开启:{ "compilerOptions": { "strict": true, "noImplicitAny": true, "strictNullChecks": true } }这些选项是TypeScript精准检测无效字段的基础。
内容的提问来源于stack exchange,提问作者Magnuti
相关产品推荐
相关产品推荐

