在 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());
}
}
我正在尝试在超级 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()
.
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());
}
}