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
相关产品推荐
相关产品推荐

