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

TypeScript:能否将泛型参数当作类型值直接使用?

TypeScript泛型参数能否直接作为值使用?

问题背景

我想要对类的泛型参数执行一些操作,目前的实现方式如下:

export type Constructable<TType> = new(...args: any[]) => TType;

export default class ThingDoer<TType> {
  public constructor(Type: Constructable<TType>) {
    this.thing = this.doTheThing(Type);
  }
}

但这种方式必须通过参数传递类型,我尝试移除该参数,改为如下写法:

export default class ThingDoer<TType extends Constructable<TType>> {
  public constructor() {
    this.thing = this.doTheThing(TType);
  }
}

此时出现错误:

'TType' only refers to a type, but is being used as a value here.

请问是否可以通过类似方式跳过传递构造函数参数?能否像常规类型那样将泛型参数用作参数?

解答

TypeScript的类型系统和运行时系统是完全分离的,泛型参数属于类型层面的概念,编译完成后会被完全擦除,运行时根本不存在TType这个值。

你不能直接把泛型参数当作值来使用,因为它从始至终都只是类型标注,没有对应的运行时实体。第一种写法中传递构造函数参数,本质是在运行时提供了该类的实际引用——这是doTheThing方法能正常工作的必要条件,因为它需要操作的是具体的类(值),而不是抽象的类型。

所以不存在跳过传递构造函数参数的方式,必须在构造函数中传入对应的类引用,才能让运行时代码获取到需要操作的目标类型实例的构造方式。

内容的提问来源于stack exchange,提问作者his dudeness

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:55:22