new () => T 构造签名
最后更新:2026-10-22
new () => T 构造签名
构造签名 new (name: string) => T 描述"这个值可以 new 出一个 T"。把类本身(而非实例)当参数传递时就需要它——工厂函数、依赖注入、插件系统都靠这个类型把"造东西的能力"抽象出来。
| 分组 | 函数与类 |
|---|---|
| 类型 | 语法 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
class Player {
constructor(public name: string, public hp = 100) {}
}
type PlayerCtor = new (name: string, hp?: number) => Player;
function spawn(Ctor: PlayerCtor, name: string, hp?: number): Player {
return new Ctor(name, hp);
}
⚙️ 参数
| new | 构造签名前缀:表示该签名要用 new 调用,而非普通调用 |
|---|---|
| (name: string, hp?: number) | 构造参数:与类构造函数参数逐位对应 |
| => Player | 构造产物类型:new 表达式的结果类型 |
返回值:new 表达式的结果类型,即构造签名 => 右侧的类型;工厂函数通常原样透传它作为返回类型。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
Ada hp=100, Ben hp=80
(转译后运行输出;把构造参数对不上的类传给 spawn 会在编译期报错)
💡 要点
ℹ️ 说明 类本身就是其构造签名的"值":传给 spawn 的是 Player 类引用,new 发生在工厂内部——这就是"类是一等公民"的类型表达。
💡 提示 泛型工厂 new (...args: any[]) => T 是依赖注入的最小类型:传入任意类,拿到 T 实例;要保留精确参数类型时用 InstanceType<typeof C>。
⚠️ 注意 抽象类不满足具体构造签名(不能直接 new);描述"类或其子类"时用 abstract new (...) => T 抽象构造签名。
🏷️ 相关函数与类
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q 构造签名和 InstanceType<typeof Player> 有什么区别?
A typeof Player 是"类本身"的类型,自带静态成员和精确构造参数;new (...) => T 只承诺"能 new 出 T",更抽象。要精确用前者,做通用工厂用后者。
Q 什么场景必须用构造签名?
A 把"类"当值传入函数时:spawn(PlayerCtor, name)、容器注册 new StorageClass()、插件系统加载 new Plugin()。普通接口只描述实例,描述不了类本身。
Q 泛型工厂怎么写既通用又类型安全?
A function create<T>(Ctor: new (...args: any[]) => T, ...args: any[]): T { return new Ctor(...args); }——入参宽松换取通用性,返回值仍是精确的 T。