为什么受保护的成员可以被TypeScript中的公共成员覆盖?

Lif*_*ang 2 javascript oop inheritance class typescript

我是Typescript的新手,我试着在这个操场上玩TypeScript .我注意到在TypeScript中,基类中的受保护成员可以被公共成员覆盖:

class Base {
    protected name: string = '!'
}

class Derived extends Base{
    public name: string = '?'
}
Run Code Online (Sandbox Code Playgroud)

一方面,这对我来说很有意义,因为Liskov替换原则仍然存在:基类比派生类有更严格的要求.但另一方面,我注意到私人成员不能被受保护或公开成员覆盖,这似乎与我不一致:

class Base {
    private name: string = '!'
}

class Derived extends Base{
    public name: string = '?'  // ERROR!
}
Run Code Online (Sandbox Code Playgroud)

因此我想知道:

  1. 我的观察是针对打字稿的预期行为还是错误?

  2. 如果是这样的话,为什么存在这种不一致?为什么TypeScript要求所有覆盖成员具有与基类成员相同的可访问性?或者允许所有具有更高可访问性的派生成员覆盖基类中的成员?

Rya*_*ugh 7

这是预期的行为.

您可以创建一个protected字段,public因为protected允许派生类读取和写入字段.派生类可以选择使用其读取和写入字段的能力,以允许其他人读取和写入字段.没有必要让你写下这样的东西:

class Foo {
  protected someField;
}

class Bar extends Foo {
  public get someFieldButPublic() {
    return this.someField;
  }
  public set someFieldButPublic(value) {
    this.someField = value;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你想做的就是someField公开.

你不能让一个private领域protected或者public是因为你没有读或写访问到该字段.是的private; 如果基类希望你有权访问该字段,那么他们protected毕竟会成功.