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

TypeScript中new、class、typeof class及T1-T4类型的区别是什么?

TypeScript中T1-T4类型差异详解

你用到的基础代码参考:

class MyClass {
}

type T1 = MyClass;
type T2 = typeof MyClass;
type T3 = new () => MyClass;
type T4 = { new(): MyClass };

各类型的具体定义

  • T1 = MyClass
    这是MyClass的实例类型,约束的是MyClass通过new关键字生成的实例对象的结构。你的代码里const t1: T1 = new MyClass()符合预期,如果直接把MyClass类本身赋值给T1类型的变量会直接报错,因为类本身不属于实例类型。
  • T2 = typeof MyClass
    这是MyClass构造函数本身的类型,会完整包含类的所有信息:包括构造函数签名、所有静态属性、静态方法的类型定义。你的代码里const t2: T2 = MyClass是直接把类本身赋值给变量,符合约束。
  • T3 = new () => MyClass
    这是无参构造函数类型的简写语法,仅约束「该类型的变量可以用new关键字调用,调用时不需要传参,返回值是MyClass的实例」,不包含类的静态成员的类型约束。
  • T4 = { new(): MyClass }
    这是构造函数类型的对象字面量写法,和T3是完全等价的,两者表达的约束完全一致,仅语法写法不同。

T2、T3、T4的核心差异

你当前的代码没有报错,是因为你的MyClass没有自定义静态成员,也没有带参数的构造函数,刚好同时符合三个类型的约束,实际三者的差异非常明显:

  1. T2包含类的静态成员定义,T3/T4不包含
    举个示例,给MyClass加静态属性:
class MyClass {
  static count = 0
}
const t2: T2 = MyClass
console.log(t2.count) // 正常,类型识别正确
const t3: T3 = MyClass
console.log(t3.count) // 报错,T3类型上不存在count属性
  1. T2会匹配MyClass的实际构造函数参数,T3/T4只匹配你定义的构造签名
    举个示例,给MyClass加带参构造函数:
class MyClass {
  constructor(name: string) {}
}
const t2: T2 = MyClass // 正常
const t3: T3 = MyClass // 报错,MyClass的构造函数需要传入string参数,不符合T3的无参构造约束

内容的提问来源于stack exchange,提问作者efkirpzcymqtnqqcrt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 01:06:03