【问题标题】:TS: missing typings for optional members in implementation of abstract class that implements interfaceTS:在实现接口的抽象类的实现中缺少可选成员的类型
【发布时间】:2018-05-15 23:05:11
【问题描述】:

游乐场代码here

示例:

interface IFoo {
    bar: number;
    foo?: () => void;
}

abstract class AbstractFoo implements IFoo {
    bar = 42;
};

由于foo 是可选的,我不需要在AbstractFoo 中实现它。但是,我可以在AbstractFoo 的孩子中实现它。因此,我希望以下代码无法编译,因为 foo 实现错误:

class ConcreteFoo1 extends AbstractFoo {
    foo: string; // type for "foo" isn't checked
}

但是 TS 不对IFoo 的可选成员进行任何类型检查。除非我明确地实现它。然后编译器将按预期执行类型检查:

class ConcreteFoo2 extends AbstractFoo implements IFoo {
    foo(arg: number) { } // error when implementing IFoo explicitly
}

所以我的问题是:为什么打字稿不为具体类隐式实现接口 IFoo?有什么方法可以强制执行这种行为吗?

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    如果AbstractFoo 实现IFoo 的方式存在类型错误,则会导致错误。 IFooAbstractFoo 类型以及以任何其他方式扩展它的类型无关。它不会对其子级强制执行foo 属性类型,因为它们不知道AbstractFoo 实现IFoo 的事实。

    这是IFoo 影响儿童班级的一种方式:

    class ConcreteFoo extends AbstractFoo implements IFoo {...}
    

    如果应该设置正确的继承,这意味着IFoo 也应该是一个类:

    abstract class AbstractFoo {
        bar: number;
        foo?: () => void;
    }
    
    abstract class BaseFoo extends AbstractFoo {
        bar = 42;
    };
    
    class ConcreteFoo extends BaseFoo {...}
    

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 2011-11-02
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多