为何获取Set类型personList的size属性时返回undefined?
问题原因与解决方案
你的问题核心在于接口返回的是普通JSON对象,并非你定义的Person类实例:
- 后端返回的
personList是数组类型,但你在Person类里声明的是Set<Address> - JSON反序列化不会自动把数组转换成Set,所以
response.personList本质还是数组,数组只有length属性,没有size,这就是size返回undefined的原因
解决办法
方法1:直接处理数组(快速临时方案)
如果只是需要获取元素数量,直接用数组的length即可;要是必须用Set,手动做类型转换:
this.personService.getPersonInfo(this.personId).subscribe((res => { let response = res.body; // 直接用数组长度 let num = response.personList.length; // 或者转成Set后取size const personSet = new Set(response.personList); num = personSet.size; ... }))
方法2:规范实例化Person类(长期维护方案)
给Person类添加构造函数,把响应的数组数据转换成Set:
export class Person { personExists: boolean; personList: Set<Address> = new Set<Address>(); constructor(data: { personExists: boolean; personList: Address[] }) { this.personExists = data.personExists; // 将传入的数组转为Set this.personList = new Set(data.personList); } }
之后在订阅时创建Person实例,就能正常访问size属性了:
this.personService.getPersonInfo(this.personId).subscribe((res => { const person = new Person(res.body); let num = person.personList.size; ... }))
补充说明
JSON仅处理纯数据对象,不会自动实例化你的自定义类,所以类里默认初始化的new Set<Address>()不会触发,必须手动将后端返回的数组转换成Set类型。
内容的提问来源于stack exchange,提问作者cs55
相关产品推荐
相关产品推荐

