如何从TypeScript类自动生成对应的TypeScript接口?
解决方案:自定义工具类型自动生成公开接口
你可以通过自定义一个类似Partial<T>的工具类型,自动将类的所有实例成员(包括继承来的)转为公开的接口类型,无需手动收集成员。
实现工具类型
首先定义Publicize<T>工具类型,它会遍历类的所有实例成员并生成对应的公开接口:
type Publicize<T> = { [K in keyof T]: T[K]; };
这个类型的原理很简单:通过映射类型遍历T的所有键(包括受保护、私有成员,TypeScript类型系统允许在类型层面访问这些成员),并保留原成员的类型,最终生成的类型就是一个所有成员均为公开的接口。
结合你的场景使用
用这个工具类型改造你原来的代码,无需手动编写包含所有成员的接口:
class A { protected do() { console.log("do"); } } // 自动生成A的公开接口类型 type PublicA = Publicize<A>; // 声明合并:让类B同时实现公开接口并继承原类 interface B extends PublicA {} class B extends A {} class C { public static readonly D = class D extends B {} } const d = new C.D(); d.do(); // 类型检查通过,编译正常
这样一来,不管父类A有多少受保护/私有成员,Publicize<A>都会自动生成包含所有成员的公开接口,彻底省去手动收集的工作量。
注意事项
- 这个工具类型会处理类的所有实例成员,包括继承链上的成员,无需额外配置。
- 当启用
declaration配置时,类表达式继承经过声明合并的类(如B),不会触发可访问性错误,因为接口已经将所有成员转为公开,满足类型声明生成的要求。
内容的提问来源于stack exchange,提问作者Mike Lischke
相关产品推荐
相关产品推荐

