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没有自定义静态成员,也没有带参数的构造函数,刚好同时符合三个类型的约束,实际三者的差异非常明显:
- 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属性
- T2会匹配
MyClass的实际构造函数参数,T3/T4只匹配你定义的构造签名
举个示例,给MyClass加带参构造函数:
class MyClass { constructor(name: string) {} } const t2: T2 = MyClass // 正常 const t3: T3 = MyClass // 报错,MyClass的构造函数需要传入string参数,不符合T3的无参构造约束
内容的提问来源于stack exchange,提问作者efkirpzcymqtnqqcrt
相关产品推荐
相关产品推荐

