可以覆盖(更改参数)超级 class 方法

Possibility to override (change args) of a super class method

我遇到了以下问题,我有 2 个 类 即

class Animal {
  public talk() {
    console.log('...');
  }
}

class Dog extends Animal {
  public talk(noise: string) {
    console.log(noise);
    super.talk()
  }
}

如您所见,原始 Animal.talk 方法没有参数,并且由于我的应用程序的限制,它不能有任何参数,但是扩展它的一些 类 可以接受额外的 noise 参数。这会引发类型错误,因为此参数最初不在 Animal 上。所以我想问一下如何正确处理这个问题。

这是一个非常简化的示例,实际用例有各种类型的 noise,我想避免将所有这些定义为 Animal.talk 的可能值,理想情况下保持它没有参数;

在这种情况下,Dog 需要同时接受 talk("string")talk()。如果您将 Dog 传递给一个接受 Animal 的函数,该函数必须能够调用 animal.talk()(否则您就违反了 substitutability)。这意味着 noise 必须是可选的:

class Dog extends Animal {
  public talk(noise?: string) {
    console.log(noise);
    super.talk()
  }
}

然后你只需要处理noise没有通过的情况。 (但这无法避免。您将始终不得不处理未通过 noise 的情况。)