Angular接口正常 报Cannot read properties of undefined读name错误
报错原因
这个错误由两个核心问题导致:
- 渲染时序问题:组件初始化阶段
seminar未赋值,默认值为undefined。Angular首次执行模板渲染时,接口异步请求还未返回,此时读取undefined的name属性会直接抛出类型错误。 - 返回值结构不匹配:从控制台打印的结果看,接口返回的是
IUserSeminar类型的数组,不是单个对象。就算请求完成后,把数组直接赋值给声明为单个对象的seminar变量,访问数组的name属性也会得到undefined。
修复方案
- 修正组件内的变量声明和赋值逻辑,对齐接口返回结构
给变量设置合理初始值,同时区分数组和单条对象的类型声明:
export class UserSeminarComponent implements OnInit { @Input() employeeNumber: number; // 存储接口返回的 seminar 数组,初始值设为空数组避免空指针 seminarList: IUserSeminar[] = []; // 存储当前要展示的单条 seminar 数据 activeSeminar?: IUserSeminar; constructor(private apiService: ApiService, private spinner: SpinnerService) { } ngOnInit(): void { this.getUserSeminar(); } private getUserSeminar(): void { this.apiService.getUserSeminar('users/seminar/', this.employeeNumber) .subscribe(data => { this.seminarList = data; // 接口返回数组,取第一条作为当前展示数据,如果有多条可以按需遍历 this.activeSeminar = data[0]; }); } }
- 调整模板渲染逻辑,做空值保护
用安全导航操作符或者*ngIf判断数据存在后再渲染内容,彻底避免初始加载阶段的空值报错:
<!-- 写法1:安全导航操作符,空值时不渲染对应内容,不会抛错 --> <p>{{ activeSeminar?.name }} test</p> <!-- 写法2:*ngIf 控制渲染时机,数据加载完成后才渲染节点,适合结构复杂的模块 --> <ng-container *ngIf="activeSeminar"> <p>{{ activeSeminar.name }} test</p> </ng-container>
- 同步修正
IUserSeminar接口定义,和实际接口返回字段类型对齐
当前的接口定义和实际返回值存在类型不匹配问题:dates实际返回字符串而非字符串数组,certificate_number实际返回字符串而非数字,建议修正避免后续出现隐性类型问题:
export interface IUserSeminar { id: number; user_id: number; dates: string; name: string; certificate_number: string; created_at: string | null; updated_at: string | null; user: Record<string, any>; // 可以按需定义user下的详细字段类型 }
内容的提问来源于stack exchange,提问作者Kael
相关产品推荐
相关产品推荐

