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

如何使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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:00:40