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

如何在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中,类本身可直接作为实例类型使用,但默认在类外部无法访问私有/受保护成员的类型。如果需要包含所有成员(包括私有、受保护)的类型,可通过以下方式实现:

  1. 在类内部定义类型别名
    利用类内部可访问所有成员的特性,在类中定义指向this的类型别名,之后在外部引用该类型:

    class SomeClass{
      public member1: string;
      private member2: string;
      protected member3: string;
    
      private method1 (){ }  
    
      // 定义包含所有成员的类型
      type AllMembers = this;
    }
    
    // 获取完整的实例类型
    type SomeClassType = SomeClass['AllMembers'];
    
  2. 泛型参数推导实例类型
    如果是在泛型场景中传入类构造函数,可直接通过泛型参数推导得到完整实例类型(只要在类的作用域内使用,就能包含私有/受保护成员):

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:31:16