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

问题描述 投票:1回答:1

我正在将代码从PHP移植到NodeJ(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));

>

错误:属性'protectedData'受保护,并且只能通过类'B'的实例进行访问。(2446)

在Typescript中是否可以实现此目的,或者PHP和Typescript中的受保护方法之间有很大区别?

我正在将代码从PHP移植到NodeJ(Typescript)。而且我遇到了以下PHP代码(简体)。>

typescript oop protected
1个回答
1
投票

docs


0
投票

docs

protected修饰符的行为与private修饰符非常相似,除了声明为protected的成员也可以在派生类中访问

在上述情况下,您使用protectedData作为功能参数anInstanceOfA的方法,而该参数恰好是基本类型A。但是您不访问通过protectedData派生类Bthis.protectedData() inin,因此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

© www.soinside.com 2019 - 2024. All rights reserved.