NestJS嵌套属性访问报错:类型'() => Company'无'isDeleted'属性
解决NestJS + Mongoose中Populate后的类型错误问题
问题根源是你错误地将User实体的companyId属性类型定义为() => Company(函数类型),但Mongoose中用于关联并支持populate的字段,实际类型应该是未填充时为ObjectId,填充后为关联的Company文档对象,类型不匹配导致TypeScript报错。
以下是具体解决步骤:
1. 修正实体类的类型定义
使用@nestjs/mongoose的Prop装饰器正确声明关联,并指定正确的类型:
首先导入必要的类型:
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import { Document, Types } from 'mongoose'; import { Company } from './company.schema'; // 导入Company实体
定义Company实体(示例)
@Schema() export class Company extends Document { @Prop() name: string; @Prop({ default: false }) isDeleted: boolean; } export const CompanySchema = SchemaFactory.createForClass(Company);
修正User实体的companyId类型
@Schema() export class User extends Document { @Prop({ type: Types.ObjectId, ref: 'Company' }) // 声明关联到Company集合 companyId: Types.ObjectId | Company; // 未populate时是ObjectId,populate后是Company文档 // 其他属性... @Prop() username: string; } export const UserSchema = SchemaFactory.createForClass(User);
如果想更严谨地区分填充前后的类型,可以使用Mongoose的PopulatedDoc类型:
import { PopulatedDoc } from 'mongoose'; // 在User实体中修改 @Prop({ type: Types.ObjectId, ref: 'Company' }) companyId: PopulatedDoc<Company & Document>;
2. 查询时的类型处理
修正实体类型后,执行populate查询时,TypeScript会自动识别companyId为Company类型:
async getUserWithCompany(userId: string) { const user = await this.userModel.findOne({ _id: userId }).populate('companyId'); // 此时访问user.companyId.isDeleted不会报错 console.log(user.companyId.isDeleted); return user; }
临时解决方案(不推荐长期使用)
如果暂时无法修改实体定义,可以通过类型断言强制指定类型:
const user = await this.userModel.findOne({ _id: userId }).populate('companyId') as User & { companyId: Company }; // 此时访问user.companyId.isDeleted正常
内容的提问来源于stack exchange,提问作者Happy Patel
相关产品推荐
相关产品推荐

