如何使typeof类与Constructor<T>交叉类型的prototype为Test而非any?
解决TypeScript交叉构造函数类型后原型类型变为
any的问题 首先咱们得搞清楚为什么交叉typeof Test和Constructor<Test>之后,prototype的类型会变成any。
你原来定义的Constructor<T>是这样的:
type Constructor<T> = new(...args: any[]) => T
在TypeScript里,单纯的构造函数类型(也就是new(...) => T),它的prototype属性默认被推断为any。而typeof Test本身是包含了正确prototype: Test类型的构造函数类型。当你把这两个类型交叉时,any会覆盖掉原本正确的Test类型,所以TNO['prototype']就变成了any。
解决办法:显式约束构造函数类型的prototype属性
我们只需要修改Constructor<T>的定义,明确指定它的prototype属性类型为T,这样交叉之后就不会被any覆盖了:
abstract class Test {} /** * Basic */ type TOK = typeof Test type TOKP = TOK['prototype'] // TOKP = Test /** * Fixed Constructor */ // 修改后的Constructor类型,显式声明prototype为T type Constructor<T> = { new(...args: any[]): T; prototype: T; }; type TNO = typeof Test & Constructor<Test> type TNOP = TNO['prototype'] // TNOP = Test ✅
这样修改之后,TNO的prototype类型就会保持为Test,因为交叉的两个类型的prototype都是Test,不会被any污染。
如果想要让Constructor<T>更贴合原生类构造函数的结构,也可以基于typeof Test的结构来定义:
type Constructor<T> = Omit<typeof Test, 'prototype'> & { new(...args: any[]): T; prototype: T; };
不过第一种修改方式已经足够解决核心问题了。
内容的提问来源于stack exchange,提问作者Huan
相关产品推荐
相关产品推荐

