Подтвердить что ты не робот

Есть ли эквивалент "запечатан" или "окончательный" в TypeScript?

Я пытаюсь реализовать метод в суперклассе, который должен быть доступен для использования, но не изменен, в подклассах. Рассмотрим это:

export abstract class BaseClass {
    universalBehavior(): void {
        doStuff(); // Do some universal stuff the same way in all sub classes
        specializedBehavior(); // Delegate specialized stuff to sub classes
    }

    protected abstract specializedBehavior(): void;
}

Мое намерение состояло в том, что любой подкласс BaseClass не только мог бы опустить реализацию universalBehavior(), но даже не иметь возможности предоставить реализацию. Разве это еще не возможно в TypeScript? Intellisense жалуется, когда я опускаю реализацию в своих подклассах. Самое лучшее, что я могу сделать, это следующее:

export class SubClass extends BaseClass {
    universalBehavior(): void {
        super.universalBehavior();
    }

    specializedBehavior(): void {
        // sub class' implementation
    }
}

Очевидно, что это проблематично, потому что я должен гарантировать, что никакой подкласс никогда не реализует universalBehavior() чем-либо другим, кроме вызова super.universalBehavior().

4b9b3361

Ответ 2

Пример реализации взлома "закрытого метода" как свойства readonly функции типа, которая выдает ошибку компилятора при попытке переопределения в расширенном классе:

abstract class BaseClass {
    protected element: JQuery<HTMLElement>;
    constructor(element: JQuery<HTMLElement>) {
        this.element = element;
    }
    readonly public dispose = (): void => {
        this.element.remove();
    }
}

class MyClass extends BaseClass {
    constructor(element: JQuery<HTMLElement>) {
        super(element);
    }
    public dispose(): void { } // Compiler error: "Property 'dispose' in type 'MyClass' is not assignable to the same property in base type 'BaseClass'"
}

TypeScript 2.0 поддерживает "финальные" классы с помощью закрытого конструктора:

class A {
    private constructor(){}
}

class B extends A{} //Cannot extend a class 'A'. Class constructor is marked as private.ts(2675)