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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:31:15