打字稿:使父类中的公共方法成为派生类中的私有/受保护方法

Posted

技术标签:

【中文标题】打字稿:使父类中的公共方法成为派生类中的私有/受保护方法【英文标题】:Typescript: Make public methods in parent become private/protected methods in derived class 【发布时间】:2020-11-25 04:58:55 【问题描述】:

我有下面这个类和一些public 方法:

class A 
  public methodOne() 
  public methodTwo() 

我有一个扩展了上述的类。

class B extends A 

如何使A 类中的publicmethodOnemethodTwo 成为B 类中的privateprotected

/*--- Expectation ---*/

const a = new A();
const b = new B();

a.methodOne(); //OK
b.methodOne(); //Error!

【问题讨论】:

【参考方案1】:

按照设计,您不能这样做。它将使 B 存在于一个边缘,声称它与 A 兼容(因为它扩展了 A),但也不与 A 兼容(因为它没有与 A 相同的公共属性)。

下面的函数应该写得很好:

function doStuff(param: A) 
  param.methodOne();

但是子类化的好处之一是多态性。 doStuff 函数不需要担心它是否传递了字面上是 A 的东西,或者它是否传递了从 A 扩展的东西。Typescript 支持这一点,因此将以下两行视为完全没问题(如果B 从 A 延伸):

doStuff(new A())
doStuff(new B())

为此,B 必须具有与 A 相同的所有属性。它可能有更多,但不能更少。

如果您不想拥有与 A 相同的属性,那么我建议不要从它扩展。

【讨论】:

以上是关于打字稿:使父类中的公共方法成为派生类中的私有/受保护方法的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在打字稿中访问另一个类中的私有变量吗

我们可以在打字稿中访问另一个类中的私有变量吗

如何在抽象父类中为实现打字稿制作泛型方法?

父类中的私有变量

实现类中的打字稿索引签名和方法不起作用

如何创建一个从打字稿中的类中提取所有方法的类型?