在 TypeScript 中是否有等同于 "sealed" 或 "final" 的东西?

Is there an equivalent to "sealed" or "final" in TypeScript?

我正在尝试在超级 class 中实现一种方法,该方法应该可以在子 class 中使用,但不可更改。考虑一下:

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 的任何子 class 不仅可以自由省略 universalBehavior() 的实现,甚至不允许提供实现。这在 TypeScript 中(还)不可能吗?当我在子 classes 中省略实现时,Intellisense 会抱怨。我能做的最好的就是:

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

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

显然这是有问题的,因为我必须确保除了调用 super.universalBehavior().

之外,没有任何子 class 实现 universalBehavior()

不,在撰写本文时还没有。有这样一个关键字的提案仍在考虑中,但可能会或可能永远不会实施。

参见:

'sealed method' 作为只读 属性 类型函数的实现 hack 示例,当尝试在扩展 class:

中覆盖时抛出编译器错误
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 通过使用私有构造函数支持 "final" classes:

class A {
    private constructor(){}
}

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

export default class CreateHandler extends BaseHandler {
    // final prop used as method
    public readonly create = (blueprint: Blueprint): Response<Record> => {
        return blueprint.create();
    };

    // normal method
    public store(blueprint: Blueprint): Response<Record> {
        return this.response(blueprint.create());
    }
}