TypeScript中是否有"密封"或"最终"?

bub*_*ing 15 inheritance final sealed typescript typescript2.0

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

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;
}
Run Code Online (Sandbox Code Playgroud)

我的意图是BaseClass的任何子类不仅可以省略实现universalBehavior(),甚至不允许提供实现.这在TypeScript中是不是可能?当我省略子类中的实现时,Intellisense会抱怨.我能做的最好的就是:

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

    specializedBehavior(): void {
        // sub class' implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

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

bub*_*ing 12

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

看到:


Ash*_*and 6

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

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'"
}
Run Code Online (Sandbox Code Playgroud)

TypeScript 2.0通过使用私有构造函数来支持“最终”类:

class A {
    private constructor(){}
}

class B extends A{} //Cannot extend a class 'A'. Class constructor is marked as private.ts(2675)
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个有效的解决方案。如果子类也使用 lambda 属性,TS 不会抱怨。https://www.typescriptlang.org/play/?ssl=1&amp;ssc=1&amp;pln=12&amp;pc=2#code/IYIwzgLgTsDGEAJYBthjAgQmgpgYVXQQG8AoBCpAewDtIoBXeKqACgEoSBfcygBwYhkAS1gIoOYABNayAJ4UpwsHypgcCALwIOALgQA3KsKlaAf CV6VKsWmCrIcaOmRUA5qwDkAEWWqwwjRuCHZAEjQQnuxWCDw8pChoGACycgRJCDgAHha4NFIY2OrpRGTWAkKi4pIyNPIISipqGtp6hsammhZl1jZ2Ds6uHj5+aoHBsAAWwshSUTGxpFxAA (3认同)
  • 好赶上!甚至不确定这是黑客。看起来非常有效,并且对我来说是期望。 (2认同)
  • @weaknespase我认为编译器将Typescript转换为Javascript的方式已更改,因为将上述内容放入Typescript游乐场,现在的错误是“ Class'BaseClass'定义实例成员属性'dispose',但扩展类'MyClass'将其定义为实例成员函数。”。这意味着解决起来确实很容易-对于“密封方法”而言,这不是可靠的解决方法。 (2认同)
  • 但是你不能创建一个“new A()”...所以它与其他语言中的“final”类并不相同 (2认同)