Почему для абстрактных классов требуется полная реализация именованных интерфейсов?

Учитывая, что у меня есть этот интерфейс:

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

И этот абстрактный класс:

export abstract class BaseState implements State {}

Компилятор машинописного текста сообщает мне, что «BaseState неправильно реализует состояние интерфейса», но для меня это не имеет смысла. Если абстрактный класс реализует интерфейс, его не следует заставлять реализовывать все его методы, поскольку это также можно делегировать подклассам.

Я знаю, что могу

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

но это определенно не СУХОЕ. Итак, есть ли веская причина для такого поведения в TypeScript?


person Toni    schedule 18.01.2017    source источник


Ответы (1)


Поскольку 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());
person Fenton    schedule 18.01.2017