TypeScript中是否有“密封”或“最终”?

时间:2017-03-15 15:49:57

标签: inheritance typescript final typescript2.0 sealed

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

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()

3 个答案:

答案 0 :(得分:10)

不,在撰写本文时没有。有关此类关键字的提案仍在考虑之中,但可能会或可能不会实施。

请参阅:

答案 1 :(得分:1)

“密封方法”作为类型函数的只读属性的实现实例,在扩展类中尝试覆盖时会引发编译器错误:

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'"
}

答案 2 :(得分:0)

// 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());
    }
}