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

TypeScript类Getter无数据返回问题求助

问题分析与解决方案

问题根源在于你定义的IMember接口将firstLastName和lastFirstName标记为实例属性,但类中是通过**访问器(getter)**实现这两个值的动态计算。TypeScript允许类用访问器匹配接口的属性定义,但当你手动创建对象或直接将JSON数据断言为IMember类型时,由于对象本身不包含这两个属性,就会触发类型检查错误,运行时也无法正常访问这两个动态计算的值。

以下是两种可行的解决方式:

方案1:修改接口为访问器定义

调整接口,明确要求这两个只读值通过访问器提供,而非实例自身的属性,让类的实现完全匹配接口要求:

export interface IMember {
  id: string;
  firstName: string;
  lastName: string;
  active: boolean;
  // 将只读属性改为访问器定义
  get firstLastName(): string;
  get lastFirstName(): string;
}

export class Member implements IMember {
  // 用参数属性简化构造函数与属性声明
  constructor(
    public id: string,
    public firstName: string,
    public lastName: string,
    public active: boolean
  ) {}

  get firstLastName(): string {
    return `${this.firstName} ${this.lastName}`;
  }

  get lastFirstName(): string {
    return `${this.lastName}, ${this.firstName}`;
  }
}

创建实例时直接调用构造函数,无需额外处理那两个动态属性:

const member = new Member('1', 'John', 'Doe', true);
console.log(member.firstLastName); // 输出 "John Doe"

方案2:正确从JSON生成类实例

如果需要从后端JSON数据生成Member实例,不要直接将JSON对象断言为Member类型,而是通过类的构造函数或Object.assign创建实例,确保继承类的访问器逻辑:

// 假设从API获取的JSON数据
const jsonData = { id: '2', firstName: 'Jane', lastName: 'Smith', active: false };

// 方式1:通过构造函数传入参数
const memberFromJson = new Member(jsonData.id, jsonData.firstName, jsonData.lastName, jsonData.active);

// 方式2:用Object.assign批量赋值(适合属性较多的场景)
const memberFromJson2 = Object.assign(new Member('', '', '', false), jsonData);

console.log(memberFromJson.lastFirstName); // 输出 "Smith, Jane"

内容的提问来源于stack exchange,提问作者MichaelPipkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:06:05