鉴于
class Foo {
x = 1;
y = 2;
}
class Bar extends Foo {
override x = 11;
z = 3;
}
是否可以自动推导出Foo
给定值Bar
?比如Superclass<Bar> === Foo
?
鉴于
class Foo {
x = 1;
y = 2;
}
class Bar extends Foo {
override x = 11;
z = 3;
}
是否可以自动推导出Foo
给定值Bar
?比如Superclass<Bar> === Foo
?
不幸的是,没有其他办法可以做到这一点,除非实际
Foo
手动提及。不可能编写一个接受实例类型
Bar
并Foo
从中生成的实用程序类型,因此无法编写type Superclass<T> = ⋯
。这是因为命名的类型Bar
实际上对一无所知Foo
。TypeScript 的类型系统是结构性的,而不是名义上的。TypeScript 关心类型的形状或结构,例如对象类型的属性。它不关心类型的名称或声明Bar
。因此,您的完全等同于(请注意,TypeScript 允许您将 重新声明
var
v
为 和Bar
,MyBar
这表明它认为它们是相同的类型。否则,会出现一个编译器错误,提示后续声明必须是相同的类型。)并且由于MyBar
类型与 没有任何关系Foo
(无法辨别 的哪些属性MyBar
可能来自其他地方),因此Bar
类型也是如此。结构类型对您可以在类型系统中执行的操作类型设置了一些限制,这就是其中一种限制。
有人可能希望至少在语句主体内部
Bar
class
能够以super
编程方式引用 的类型,但这也是不可能的。没有像多态类型super
那样工作的“多态类型” 。我在TypeScript GitHub 存储库问题中没有找到任何现有的功能请求;如果你真的需要这个,你可以考虑提交请求,但考虑到今天的解决方法只是“使用而不是”,而且没有其他人要求这样做,这样的请求不太可能得到实现。this
Foo
super
游乐场链接到代码