如何在.d.ts文件中让类包含接口属性,避免重复定义?
无需重复定义属性的.d.ts写法
你可以利用TypeScript的声明合并特性,让类的实例自动继承Options接口的所有属性,避免重复代码:
步骤1:定义Options接口
先写出你的配置项接口,包含所有需要扩展到实例的属性:
// .d.ts文件中 export interface MyClassOptions { name: string; age: number; email: string; }
步骤2:声明类并合并实例类型
先声明类的构造函数,再通过同名接口合并,把Options的属性注入到类的实例类型中:
export declare class MyClass { constructor(options: MyClassOptions); } // 关键:通过接口合并,让MyClass实例自动拥有MyClassOptions的所有属性 export interface MyClass extends MyClassOptions {}
这样写之后,当你在TypeScript中使用这个类时,实例会自动拥有name、age、email等属性,完全匹配你用Object.assign实现的JavaScript逻辑,而且不需要在类的声明里重复写这些属性。
原理
TypeScript支持同名的接口与类进行声明合并,这里的interface MyClass会被合并到MyClass类的实例类型上,相当于给实例扩展了MyClassOptions的全部属性,完美适配你的需求。
备选方案:交叉类型构造函数
如果你偏好更直接的类型定义方式,也可以直接指定构造函数的返回类型为类实例与Options的交叉类型:
export interface MyClassOptions { name: string; age: number; } export declare const MyClass: { new(options: MyClassOptions): MyClass & MyClassOptions; }; // 声明基础的MyClass接口(如果需要额外类方法/属性的话) export interface MyClass { // 可以在这里添加类本身的方法,比如: sayHello(): void; }
这种写法同样能让实例拥有Options的属性,适合需要额外定义类方法的场景。
内容的提问来源于stack exchange,提问作者Pavlo
相关产品推荐
相关产品推荐

