web-dev-qa-db-ja.com

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()を実装しないことを確認する必要があるため、これは明らかに問題があります。

25
bubbleking

いいえ、この記事の執筆時点ではありません。まだ検討中ですが、実施される場合と実施されない場合がある、このようなキーワードの提案があります。

見る:

16
bubbleking

拡張クラスでオーバーライドしようとするとコンパイラエラーをスローする、関数型の読み取り専用プロパティとしての「封印されたメソッド」の実装ハックの例:

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)
8
Asher Garland
// 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());
    }
}
0
Qwerty Pnk