TypeScript 不允许引用自身的getter

dauxcl2d  于 2022-10-29  发布在  TypeScript
关注(0)|答案(5)|浏览(219)

建议

从来没有一个示例(我能想到的)类getter函数需要引用它自己。如果它这样做,试图调用该函数会抛出too much recursion error。所以TypeScript编译器不应该允许这种情况发生。

用例

这将确保任何使用私有类成员并添加可公开访问的getter的人都不会意外地引用公共getter而不是私有成员(请参见下面的示例)。
它还可以确保,如果有人正在重构并希望将私有成员更改为公共成员,他们可以使用“Rename Symbol”进行更改,例如将_example更改为example,并且任何现有的get example()都将引发错误。
示例
下列程式码会掷回错误:

  1. class Example {
  2. private _exampleProperty: string = "example";
  3. public get exampleProperty(): string {
  4. return this.exampleProperty; // Self-referential; should be this._exampleProperty
  5. }
  6. }

检查清单

我的建议符合以下准则:

  • 这不会是对现有TypeScript/JavaScript代码的重大更改
    • 我不知道这个?它可能会引发当前不存在的错误,但我想不出一个例子,这 * 不应该 * 是一个错误。*
  • 这不会改变现有JavaScript代码的运行时行为
  • 这可以在不基于表达式的类型发出不同JS的情况下实现
  • 这不是运行时功能(例如,库功能、带有JavaScript输出的非ECMAScript语法等)
  • 这个特性将与TypeScript's Design Goals的其余部分一致。
  • 这与目标1一致:“静态识别可能是错误的构造.”
qeeaahzv

qeeaahzv1#

getter可以像递归函数一样运行。我无法给出一个不傻的例子,但也许有人已经给出了:

  1. class Example {
  2. private _exampleProperty: string = "example";
  3. counter = 4;
  4. public get exampleProperty(): string {
  5. if (this.counter == 0) {
  6. return this._exampleProperty;
  7. } else {
  8. // Do something
  9. this.counter--;
  10. return "?" + this.exampleProperty;
  11. }
  12. }
  13. }
jfewjypa

jfewjypa2#

哦,这是一个很好的观点。也许只是错误时,函数 * 只 * 返回自己?这似乎是最常见的例子,无论如何,这个错误。

w1jd8yoj

w1jd8yoj3#

这作为一个linter规则是否更有意义(并且是合理可实现的)?
getter可以像递归函数一样运行。我无法给出一个不傻的例子,但也许有人已经给出了:
如果只在递归调用不在条件内时引发错误,则可以避免此示例。

ca1c2owp

ca1c2owp5#

我想棘手的是getter是一个空函数,因此在不引用外部数据(全局变量、示例属性等)的情况下,您无法对终止条件进行编码。getter * 可以 * 在这个意义上是递归的,但它肯定不会是我如何实现的首选。
无论如何,这似乎更像是一个lint规则,而不是一个tsc错误。

相关问题