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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:45:29