【问题标题】:Why is it required for abstract classes to implement named interfaces completly?为什么抽象类需要完全实现命名接口?
【发布时间】:2017-01-19 00:46:54
【问题描述】:

鉴于我有这个界面:

export class interface State {
  default(): void;
}

还有这个抽象类:

export abstract class BaseState implements State {}

打字稿编译器告诉我“BaseState 错误地实现了接口状态”——但这对我来说没有意义。如果抽象类实现了一个接口,则不应强制它实现它的所有方法,因为这也可以委托给子类。

我知道我能做到

export abstract class BaseState implements State {
  abstract default(): void;
}

但这绝对不是 DRY。那么,是否有充分的理由在 TypeScript 中出现这种行为?

【问题讨论】:

    标签: typescript typescript2.0


    【解决方案1】:

    因为 TypeScript 是结构化类型的,所以添加 implements 语句的唯一原因是收到一条警告,提示您忘记从接口实现方法。

    如果您不想被警告,您可以简单地省略 implements State 注释。

    示例...我正在使用Example 接口来确保传递给我的usesExample 的对象是可接受的...我始终获得类型安全,并且我不需要放置@ 的抽象实现987654325@ 在我的抽象类上。

    如果我想被告知是否忘记添加某些内容,我可以(可选地)将Example 接口添加到SubExample...但是使用usesExample 的行无论如何都会这样做。

    interface Example {
        method(): string;
    }
    
    abstract class BaseExample {
        abstract foo(): string;
    }
    
    class SubExample extends BaseExample {
        foo() {
            return '';
        }
    
        method() {
            return '';
        }
    }
    
    function usesExample(example: Example) {
        return example.method();
    }
    
    usesExample(new SubExample());
    

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 2013-02-15
      • 2011-02-11
      • 2014-03-18
      • 2011-12-23
      • 1970-01-01
      • 2010-11-09
      • 2013-06-15
      • 1970-01-01
      相关资源
      最近更新 更多