能否创建与泛型属性同名但值类型不同的类?
实现与泛型参数属性名一致但值类型不同的类
当然可以实现这类需求,你需要借助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
相关产品推荐
相关产品推荐

