TypeScript如何让类直接继承JSON对象属性以简化访问?
解决方案
要实现直接通过SampleHospital.contact访问属性,同时解决TypeScript的类型报错,你可以通过接口继承+Object.assign批量挂载属性的方式处理,具体步骤如下:
1. 定义数据与类的类型接口
首先为hospital.json的结构定义类型接口,再让Hospital类的接口继承这个数据接口,同时声明类的方法:
// 匹配hospital.json结构的接口 interface HospitalData { id: string; name: string; contact: string; address: string; // 其他你需要的字段... } // 定义Hospital类的完整类型:包含数据字段+自定义方法 interface Hospital extends HospitalData { getContactInfo(): string; // 其他自定义方法... }
2. 实现Hospital类
在构造函数中使用Object.assign将JSON数据的所有属性直接挂载到类实例上,这样就无需额外的.hospital前缀:
class Hospital { constructor(hospitalData: HospitalData) { // 把JSON数据的所有属性批量赋值给实例 Object.assign(this, hospitalData); } getContactInfo(): string { return `联系信息:${this.name} - ${this.contact}`; } }
3. 实例化使用
现在你可以直接访问实例的属性,TypeScript也会正确识别类型:
// 假设从文件读取hospital.json数据 const hospitalJson = require('./hospital.json') as HospitalData; const sampleHospital = new Hospital(hospitalJson); console.log(sampleHospital.contact); // 直接访问,无类型报错 console.log(sampleHospital.getContactInfo()); // 调用自定义方法
补充:自动推导JSON类型
如果不想手动写HospitalData接口,可以通过typeof自动推导JSON的类型:
// 导入JSON数据并推导类型 const hospitalJson = require('./hospital.json'); type HospitalData = typeof hospitalJson; // 后续接口和类的实现和上面一致 interface Hospital extends HospitalData { getContactInfo(): string; } class Hospital { constructor(hospitalData: HospitalData) { Object.assign(this, hospitalData); } getContactInfo(): string { return `联系信息:${this.name} - ${this.contact}`; } }
为什么之前遍历赋值会报错?
TypeScript是静态类型语言,默认不会识别动态添加的属性。通过让Hospital接口继承数据字段的接口,相当于告诉编译器:这个类的实例不仅有自定义方法,还包含所有JSON数据的字段,这样就不会出现字段缺失的报错。
内容的提问来源于stack exchange,提问作者MINJA KIM
相关产品推荐
相关产品推荐

