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

Accessing protected method from other instance with same parent class in typescript

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

<?php
class A {
    protected function protectedData() {
        return 'accessible';
    }
}
class B extends A {
    public function extractTest($anInstanceOfA) {
        return $anInstanceOfA->protectedData();
    }
}
$instanceA = new A();
$instanceB = new B();
echo $instanceB->extractTest($instanceA);

运行 它在沙箱中会产生回显 "accessible"。

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

class A {
  protected protectedData(): string {
    return 'accessible';
  }
}

class B extends A {
  public extractTest(anInstanceOfA: A): string {
    return anInstanceOfA.protectedData();
  }
}

const instanceA = new A();
const instanceB = new B();


console.log(instanceB.extractTest(instanceA));

Error: Property 'protectedData' is protected and only accessible through an instance of class 'B'.(2446)  

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

来自docs:

The protected modifier acts much like the private modifier with the exception that members declared protected can also be accessed within deriving classes.

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

class B extends A {
  public extractTest(anInstanceOfA: A, instanceOfB: B): string {
    anInstanceOfA.protectedData() // ✖, protected member of arg with base class 
    instanceOfB.protectedData() // ✔, protected member of arg with *same* class 
    this.protectedData(); // ✔, (derived) protected member via `this`
    return anInstanceOfA["protectedData"]() // escape-hatch with dynamic property access
  }
}

因此您可以将 protectedData 声明为 public 或使用逃生舱口,这将使 protected 成员可以通过使用括号表示法的动态 属性 访问来访问。

anInstanceOfA["protectedData"]()

Playground sample to try it out