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。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏