如何在TypeScript中将类转换为可作为泛型参数的类型?
将TypeScript类转换为包含所有成员的类型
我需要将类用作泛型参数,因此得把类转换为对应的类型。
现有类:
class SomeClass{ public member1: string; private member2: string; protected member3: string; private method1 (){ } }
想要得到的目标类型:
type SomeClassType = { member1: string; member2: string; member3: string; method1: () => void; }
尝试过以下方法,但都无法访问member1等成员:
type T1 = typeof ClassConstructor<SomeClass>; type T2 = typeof SomeClass; type T3 = keyof typeof SomeClass; const v1: T1; // v1.member1 无法生效 const v2: T2; // v2.member1 无法生效 const v3: T3; // v3.member1 无法生效
解决方法
TypeScript中,类本身可直接作为实例类型使用,但默认在类外部无法访问私有/受保护成员的类型。如果需要包含所有成员(包括私有、受保护)的类型,可通过以下方式实现:
在类内部定义类型别名
利用类内部可访问所有成员的特性,在类中定义指向this的类型别名,之后在外部引用该类型:class SomeClass{ public member1: string; private member2: string; protected member3: string; private method1 (){ } // 定义包含所有成员的类型 type AllMembers = this; } // 获取完整的实例类型 type SomeClassType = SomeClass['AllMembers'];泛型参数推导实例类型
如果是在泛型场景中传入类构造函数,可直接通过泛型参数推导得到完整实例类型(只要在类的作用域内使用,就能包含私有/受保护成员):function createInstance<T>(cls: new () => T): T { return new cls(); } // instance的类型会包含SomeClass的所有成员 const instance = createInstance(SomeClass);
注意事项
- 类外部的访问控制规则依然生效:即使类型包含私有/受保护成员,你也无法在类外部直接访问这些成员的具体值,仅能在类型层面使用。
- 如果只需要类的公共成员类型,直接使用
InstanceType<typeof SomeClass>即可:type PublicSomeClassType = InstanceType<typeof SomeClass>;
内容的提问来源于stack exchange,提问作者user14082
相关产品推荐
相关产品推荐

