首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TypeScript中有没有等同于"sealed“或"final”的东西?

在TypeScript中有没有等同于"sealed“或"final”的东西?
EN

Stack Overflow用户
提问于 2017-03-15 23:49:57
回答 3查看 23K关注 0票数 41

我正在尝试在一个超类中实现一个方法,它应该可以在子类中使用,但不能改变。请考虑以下内容:

代码语言:javascript
复制
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会报错。我能做的最好的事情就是:

代码语言:javascript
复制
export class SubClass extends BaseClass {
    universalBehavior(): void {
        super.universalBehavior();
    }

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

显然,这是有问题的,因为我必须确保除了对super.universalBehavior()的调用之外,任何子类都不会实现universalBehavior()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-04 01:38:40

不,在写这篇文章的时候还没有。有一个关于这样一个关键字的提议仍在考虑中,但可能会也可能永远不会实现。

请参见:

票数 29
EN

Stack Overflow用户

发布于 2019-02-06 09:51:26

在扩展类中尝试重写时抛出编译器错误的类型函数的只读属性的实现hack示例:

代码语言:javascript
复制
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通过使用私有构造函数来支持“最终”类:

代码语言:javascript
复制
class A {
    private constructor(){}
}

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

Stack Overflow用户

发布于 2020-04-10 01:34:56

代码语言:javascript
复制
// 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());
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42814649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档