从打字稿中具有相同父 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"]()
我正在将代码从 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"]()