TypeScript final 类装饰器

293次阅读
没有评论

如何防止在TypeScript中继承类。

TypeScript这些final其他语言中常见的类修饰符,但是使用装饰器,我们可以实现类似的功能。

Final class decorator

export function final<T extends { new (...args: any[]): object }>(target: T): T {
    return class Final extends target {
        constructor(...args: any[]) {
            if (new.target !== Final) {
                throw new Error('Cannot inherit from final class');
            }
            super(...args);
        }
    };
}

用法:

@final
export class Example {
}

如果您尝试从Example该类继承并创建该类的新实例,则将引发异常。

export class ExampleSub extends Example {
}

new ExampleSub(); // error is thrown

该异常将会在运行时发生,因此请记住这一点。

Frozen class decorator

JavaScript还具有冻结对象的概念,这基本上意味着该对象变得不可变。

export function frozen(target: Function): void {
    Object.freeze(target);
    Object.freeze(target.prototype);
}

使用此装饰器,您可以防止更改类本身及其原型。

用法:

@frozen
export class Example {
}

const isFrozen = Object.isFrozen(Example); // true

摘要

您可以将这两个结合在一起,并防止类被修改和继承。