Ответ 1
Нет, на момент написания этой статьи нет. Существует предложение для такого ключевого слова, которое все еще рассматривается, но может или не может быть реализовано.
Увидеть:
Я пытаюсь реализовать метод в суперклассе, который должен быть доступен для использования, но не изменен, в подклассах. Рассмотрим это:
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()
.
Нет, на момент написания этой статьи нет. Существует предложение для такого ключевого слова, которое все еще рассматривается, но может или не может быть реализовано.
Увидеть:
Пример реализации взлома "закрытого метода" как свойства 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)