问题描述
我想保护所有的类方法并防止它们被覆盖,例如Object.assign(dog,{ bark: true});
。有人说,因此,您不应在Typescript中使用类方法,因为与简单的函数和方法不同,类方法是可重写的。
class Animal {
eingezahltkaptial: number[]=[1,2,3];
move(distanceInMeters: number = 0) {
console.log(`Animal moved ${distanceInMeters}m.`);
}
hello(): void {
console.log(`Animal moved m.`);
}
}
class Dog extends Animal {
bark(): void {
console.log("Woof! Woof!");
}
}
const dog = new Dog();
Object.assign(dog,{ bark: true});
dog.bark();
[ERR]: "Executed JavaScript Failed:"
[ERR]: dog.bark is not a function
解决方法
您应该冻结课程。装饰器模式是实现它的一种简单方法,但是您也可以自己调用冻结。 (Object.assign不是typesafe的打字工具,不是很好的工具)
function frozen(target: Function): void {
Object.freeze(target);
Object.freeze(target.prototype);
}
@frozen
class Dog extends Animal {
bark(): void {
console.log("Woof! Woof!");
}
}
const dog = new Dog();
Object.assign(dog,{ bark: true }); // TypeError: Cannot assign to read only property 'bark' of object '#<Dog>'
dog.bark();
关于人们对readonly
的评论:
-
readonly
可以应用于方法;仅属性 - readonly是仅TS的功能,如果软件处于可以动态发生突变的状态,那么它将提供零保护
- 适用于只读且使用.freeze的地方,TS会自动将readonly修饰符添加到属性中,而无需手动将其添加到其中。