基于Typescript的基于条件类型的扩展行为与预期不符

问题描述 投票:1回答:1

假设我们有这个例子:

class Base<T extends Base<T>> {}
class ClassA extends Base<ClassA> {}
class ClassB extends Base<ClassB> {}
type Condition = ClassA extends ClassB ? true : false;

基类有一个泛型参数,基本上说,从它的任何派生物应该用它自己的类型模板化它。

然后我们有2个派生自所述基础的类。

最后,我创建了一个条件类型,用于检查派生类是否相互扩展。

令我惊讶的打字稿告诉我他们这样做,但我认为这种情况应该是假的。 ClassA没有扩展ClassB,反之亦然。只有ClassA extends Base<ClassA>应该返回true。

这是打字稿的条件类型的问题还是我错过了什么?我在构建更复杂的条件类型时遇到了这个问题,并且还返回了意外的结果。

编辑:也不需要通用参数。即使这个例子返回错误的结果:

class Base {}
class ClassA extends Base {}
class ClassB extends Base {}
type Condition = ClassA extends ClassB ? true : false;
typescript type-inference typescript-generics conditional-types
1个回答
3
投票

打字稿使用结构类型来最好地模拟Javascript duck typing的工作方式。这样做的好处是允许我们以静态类型的方式对很多Javascript场景进行建模。

问题是你必须永远不要忘记,当typescript检查任何类型的可比性(即使在条件类型中)它不检查像C#或Java那样的名义继承,它正在检查结构子类型。

在你的例子中,由于所有类都是空的,它们在结构上等同于{},这意味着是的,ClassA确实扩展了ClassBClassB扩展ClassA,因为它们在结构上都是相同的类型。

将任何成员添加到类中并且这消失了,私有成员确保最大程度的不兼容性,因为另一个类(或接口)不能仅声明声明它们来模仿子类型。

class Base {}
class ClassA extends Base { private a: number}
class ClassB extends Base { private b: number}
type Condition = ClassA extends ClassB ? true : false; // false now
© www.soinside.com 2019 - 2024. All rights reserved.