如何防止方法被覆盖并分配其他类型?

时间:2020-10-03 20:19:03

标签: javascript typescript class-method

我想保护所有的类方法并防止它们被覆盖,例如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 

1 个答案:

答案 0 :(得分:0)

您应该冻结课程。装饰器模式是实现它的一种简单方法,但是您也可以自己调用冻结。 (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修饰符添加到属性中,而无需手动将其添加到其中。