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
相关产品推荐
相关产品推荐

