为什么抽象类需要完全实现命名接口?

时间:2017-01-18 15:10:33

标签: typescript typescript2.0

鉴于我有这个界面:

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

这个抽象类:

export abstract class BaseState implements State {}

typescript编译器告诉我" BaseState错误地实现了接口状态" - 但这对我没有意义。如果抽象类实现了一个接口,那么它就不应该被强制实现它的所有方法,因为它也可以被委托给子类。

我知道我能做到

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

但这绝对不是干的。那么,有没有什么理由在TypeScript中出现这种行为?

1 个答案:

答案 0 :(得分:0)

因为TypeScript是结构化类型的,所以添加implements语句的唯一原因是要发出警告,忘记从界面实现方法。

如果您不想收到相关警告,可以直接省略implements State注释。

示例...我正在使用Example界面来确保传递给我的usesExample的对象是可以接受的...我始终保持类型安全,而且我不需要在我的抽象类上放置method的抽象实现。

我可以(可选)将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());
相关问题