TS开发MongoDB /me接口遇TS2339错误,请求技术帮助
解决TS2339:Property '_id' does not exist on type 'User'
这个错误的核心是TypeScript无法识别req.user上的_id属性,根源在于你的类型定义缺失或不正确,以下是具体解决步骤:
1. 扩展Express Request类型,添加user字段
Express默认的Request接口没有user属性,需要手动扩展它。在项目中创建类型声明文件(比如src/types/express.d.ts):
declare namespace Express { interface Request { user?: { _id: string | mongoose.Types.ObjectId; // 匹配你JWT解析后返回的_id类型 // 可添加其他你需要的字段,如username、email等 }; } }
同时确保tsconfig.json的include数组包含这个类型文件,让TS能识别:
{ "include": ["./src/**/*", "./src/types/**/*"] }
2. 确保Mongoose User模型的类型正确
如果你的User模型是用Mongoose定义的,要让TS明确User类型包含_id:
import mongoose, { Schema, Document } from 'mongoose'; // 定义User接口,继承Document(自带_id属性) interface User extends Document { // 这里添加你的其他业务字段 email: string; password: string; } const UserSchema = new Schema({ email: { type: String, required: true }, password: { type: String, required: true }, }); // 关联User接口到模型 const UserModel = mongoose.model<User>('User', UserSchema); export default UserModel;
继承Document后,TS会自动识别_id属性,类型为mongoose.Types.ObjectId。
3. 类型匹配处理
如果JWT解析后req.user._id是字符串类型,而findById接受ObjectId或字符串,Mongoose会自动转换,但TS可能仍报错,可手动转换类型:
// 导入mongoose import mongoose from 'mongoose'; // 在接口中使用 const user = await UserModel.findById(mongoose.Types.ObjectId(req.user?._id));
或者直接把req.user._id的类型定义为mongoose.Types.ObjectId(前提是JWT解析时就返回ObjectId类型)。
4. 避免滥用any类型
你之前加any没解决问题,是因为any只是跳过了TS的类型检查,并没有真正修复类型定义的问题。正确的做法是补全缺失的类型声明,让TS能正确推断和检查。
内容的提问来源于stack exchange,提问作者KiKi_Play
相关产品推荐
相关产品推荐

