You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:00:11