TypeScript中如何在泛型接口中存储类型而非实例?
实现存储泛型类型的构造函数而非实例
你可以实现这个需求,核心是要明确构造函数类型在TypeScript中的表示方式,下面是两种可行方案:
方案一:泛型参数直接约束为构造函数类型
把泛型参数T定义为构造函数类型,这样属性b就直接是该构造函数类型,同时可以通过InstanceType<T>获取对应的实例类型:
interface A<T extends new () => object> { b: T; } // 使用示例 class MyClass {} // 泛型参数传入MyClass的构造函数类型typeof MyClass const a: A<typeof MyClass> = { b: MyClass };
方案二:泛型参数保留实例类型,约束b为对应构造函数
如果希望泛型参数T仍然代表实例类型,那么可以把b的类型定义为构造签名,确保它是能生成T实例的构造函数:
interface A<T extends object> { b: new () => T; } // 使用示例 class MyClass {} // 泛型参数传入实例类型MyClass,b自动约束为MyClass的构造函数 const a: A<MyClass> = { b: MyClass };
为什么你的初始写法不对?
你尝试的typeof T是错误的——T是类型参数,而typeof运算符只能作用于具体的值(比如变量、类名),不能直接作用于类型,所以TypeScript编译器会报错。
你用Object的写法虽然能存储构造函数,但完全失去了类型约束:任何对象都能赋值给b,无法保证它是对应T的构造函数,上面的两种方案则解决了这个问题。
内容的提问来源于stack exchange,提问作者Seb Heron
相关产品推荐
相关产品推荐

