如何控制多个 class 对 class 成员的访问(即具有范围 folder/namespace 的访问修饰符)?

How to control access to class members for multiple classes (i.e. an access modifier with the scope folder/namespace)?

在 Java 中,受保护的 class 成员可以被同一包内的任何 class 访问,但不能被外部的 class 访问。我如何在 Typescript 中完成此操作?

例如我想要一个 class Foo 和一个 class Foo2(不继承自 Foo),它们可以互相访问 "protected" 成员。但是范围外的 class 栏(例如我的文件夹或命名空间)应该只能访问 public 成员。

protected/private class 成员访问权限:

目前没有软件包 internal access modifier in TS yet. A possible workaround is to use an escape hatch
class Foo { 
  protected f1 = "f1" 
}

class Foo2 {
  protected f2 = "f2"

  public doSomething(foo: Foo) {
    foo["f1"] // this works
  }
}

您可以通过 属性 使用方括号访问从另一个 class 访问 protected 成员。

是的,行得通。通常,此变通办法仍将对其他 class 成员隐藏 protected 成员。假设 FooFoo2 在同一个包中,因此具有更强的耦合,他们可以更好地了解另一个 class 的实现细节,例如受保护的 属性 名称。所以这个 hatch 从架构的角度来看应该也是有效的。

如果需要更高的安全性,您可以创建额外的 FooFoo2 类型以与子包的 public API 一起使用,因此客户端甚至不知道给定的 class:

class Foo implements FooPublic {
  publicProp = 42
  protected foo = "foo"
}

interface FooPublic {
  publicProp: number // only publicProp is visible to client
}

附加说明:还有一个名为 import/no-internal-modules 的 ESLint 规则强制执行,客户端不能 import 来自子模块的真实 class。