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

能否创建与泛型属性同名但值类型不同的类?

实现与泛型参数属性名一致但值类型不同的类

当然可以实现这类需求,你需要借助TypeScript的映射类型来定义类的属性结构,同时在构造函数中完成属性的初始化。下面是具体的实现方案:

1. 先定义目标属性类

首先创建你需要的Attribute类,包含期望的方法:

class Attribute {
  special_method_in_attribute() {
    console.log("执行Attribute类的特殊方法");
  }
}

2. 实现泛型API类

利用映射类型让类的属性与泛型参数的属性名完全匹配,同时将属性值类型统一设为Attribute:

interface Project {
  id: number;
  title: string;
}

class API<T> {
  // 用映射类型绑定泛型T的所有属性,值类型为Attribute
  [K in keyof T]: Attribute;

  constructor(keys: Array<keyof T>) {
    // 遍历传入的属性键,初始化每个属性为Attribute实例
    keys.forEach(key => {
      this[key] = new Attribute();
    });
  }
}

3. 调用示例

按照你的需求创建实例并调用方法:

const x = new API<Project>(['id', 'title']);
x.title.special_method_in_attribute(); // 正常执行方法
x.id.special_method_in_attribute();    // 同样可以调用

关键说明

  • 映射类型[K in keyof T]: Attribute是核心,它会遍历泛型T的所有属性键,为类生成同名属性,且属性类型固定为Attribute。
  • 构造函数中传入属性键数组是为了在运行时正确初始化属性(因为TypeScript接口在运行时不存在,无法直接获取其键名),这种方式避免了类型断言带来的潜在风险。
  • 如果泛型T包含可选属性,映射后的属性也会是可选的,你可以根据需求在构造函数中决定是否初始化可选属性。

内容的提问来源于stack exchange,提问作者Gabriel Santos Carvalho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:25:20