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

TypeScript中描述类的interface与该类的typeof类型是否相等?

问题核心原因

你在描述构造函数类型的IPoint接口中错误加入了类实例属性,而typeof Point对应的是类构造函数本身(静态侧)的类型,本身不持有实例的x、y属性,两个类型结构存在差异,因此严格判等结果为false。

具体解释

  • public x: number写在构造函数参数中是TS的简写语法,代表这两个属性是类实例的属性,只有通过new Point()生成的实例对象才会拥有这两个属性。
  • typeof Point获取的是Point构造函数自身的类型,也就是类的静态侧类型,这个类型上只会包含你显式声明的静态属性、构造签名、prototype属性三类成员,不会包含实例属性。
  • 你当前写的IPoint接口要求该类型同时拥有x、y属性,相当于要求构造函数本身有这两个值,和实际的typeof Point结构不匹配。

修正后的验证代码

class Point{
    constructor(public x: number, public y: number){}
}

// 构造函数类型接口,仅描述构造函数自身的结构,不包含实例属性
interface IPointConstructor<T> {
    prototype: T;
    new(x: number, y: number): T;
}

type Equal<X, Y> =
  (<T>() => T extends X ? 1 : 2) extends
  (<T>() => T extends Y ? 1 : 2) ? true : false

// 此时判等结果为 true
type R = Equal<typeof Point, IPointConstructor<Point>>; 

补充说明

你更新后的理解是正确的:带构造签名的interface本质描述的就是函数对象,class的底层实现就是构造函数,该函数对象上的属性完全对应class的静态属性,和实例属性完全隔离。如果需要描述类的实例结构,需要单独写对应的实例接口,和构造函数接口分开。

如果确实需要构造函数本身持有x、y属性,也可以给类声明对应的静态属性,此时你最初写的IPoint和typeof Point就会严格相等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 07:57:01