从打字稿中具有相同父类的其他实例访问受保护的方法

Mat*_*lde 3 oop protected typescript

我正在将代码从 PHP 移植到 NodeJs(Typescript)。\n我遇到了以下 PHP 代码(简化)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2 \xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0

\n\n
<?php\nclass A {\n    protected function protectedData() {\n        return \'accessible\';\n    }\n}\nclass B extends A {\n    public function extractTest($anInstanceOfA) {\n        return $anInstanceOfA->protectedData();\n    }\n}\n$instanceA = new A();\n$instanceB = new B();\necho $instanceB->extractTest($instanceA);\n
Run Code Online (Sandbox Code Playgroud)\n\n

在沙箱中运行它会产生“可访问”的回显。

\n\n

我在 Typescript 中编写了相同的代码,但这似乎不起作用......

\n\n
class A {\n  protected protectedData(): string {\n    return \'accessible\';\n  }\n}\n\nclass B extends A {\n  public extractTest(anInstanceOfA: A): string {\n    return anInstanceOfA.protectedData();\n  }\n}\n\nconst instanceA = new A();\nconst instanceB = new B();\n\n\nconsole.log(instanceB.extractTest(instanceA));\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0

\n\n
\n

错误:属性“protectedData”受保护,只能通过类“B”的实例访问。(2446)\n \xc2\xa0

\n
\n\n

有没有办法在 Typescript 中实现这一点,或者 PHP 和 Typescript 中的受保护方法之间有很大区别吗?

\n

for*_*d04 7

来自文档

\n\n
\n

protected 修饰符的作用与 private 修饰符非常相似,不同之处在于声明为 protected 的成员也可以在派生类中访问

\n
\n\n

在上面的情况下,您使用protectedData函数参数的 as 方法anInstanceOfA,该参数恰好是基本类型A。但是你不能在派生类protectedData B访问by this.protectedData(),所以 TS 在这里大喊大叫。什么有效,什么无效:

\n\n
class B extends A {\n  public extractTest(anInstanceOfA: A, instanceOfB: B): string {\n    anInstanceOfA.protectedData() // \xe2\x9c\x96, protected member of arg with base class \n    instanceOfB.protectedData() // \xe2\x9c\x94, protected member of arg with *same* class \n    this.protectedData(); // \xe2\x9c\x94, (derived) protected member via `this`\n    return anInstanceOfA["protectedData"]() // escape-hatch with dynamic property access\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,您可以声明protectedDatapublic或使用转义舱口,这将使protected成员可以通过带有括号表示法的动态属性访问来访问。

\n\n
anInstanceOfA["protectedData"]()\n
Run Code Online (Sandbox Code Playgroud)\n\n

游乐场样本来尝试一下

\n