如何控制多个 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
成员。假设 Foo
和 Foo2
在同一个包中,因此具有更强的耦合,他们可以更好地了解另一个 class 的实现细节,例如受保护的 属性 名称。所以这个 hatch 从架构的角度来看应该也是有效的。
如果需要更高的安全性,您可以创建额外的 Foo
和 Foo2
类型以与子包的 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。
在 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
成员。假设 Foo
和 Foo2
在同一个包中,因此具有更强的耦合,他们可以更好地了解另一个 class 的实现细节,例如受保护的 属性 名称。所以这个 hatch 从架构的角度来看应该也是有效的。
如果需要更高的安全性,您可以创建额外的 Foo
和 Foo2
类型以与子包的 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。