【问题标题】:TSLint ESLint - warn when function accessed as property?TSLint ESLint - 当函数作为属性访问时发出警告?
【发布时间】:2018-10-30 05:23:42
【问题描述】:

我犯过几次这个错误 - 想知道是否有 ESLint 或 TSLint 规则可以发现它

if (this.isBrowser && this.imageURL) {.....}

private isBrowser(): boolean{
    return isPlatformBrowser(this.platformId);
}

使用this.isBrowser 将始终返回true,因为它是一个函数的事实是真实的。我要么必须使用get isBrowser() {}this.isBrowser()

ESLint 或 TSLint 是否可以检查并警告对函数的调用正在编写为属性访问器?

【问题讨论】:

  • 它不是“被称为 getter”,你只是在访问一个碰巧可以调用的属性。这不一定是 JS 或 TS 中的错误,因此 linter(或编译器)不会发现它;您要么必须显式分配 const isBrowser: boolean = this.isBrowser; 以获得编译器警告,要么可能更好的是通过测试而不是 linting 来验证这一点。
  • @jonrsharpe 已编辑,您是对的,它不是吸气剂。 linters 发现了很多不是错误的东西(无尾随空格、无变量关键字、首选常量),所以我想这可能是其中之一

标签: javascript typescript eslint tslint


【解决方案1】:

linter 可以处理属性 getter 的唯一情况是当它们可能是无操作时,有 TSLint/ESLint no-unused-expression rule

this.isBrowser; // causes linter error

Chai 断言就是这种情况。在任何其他情况下,this.isBrowser 都不是空操作。

if (this.isBrowser) 是检查isBrowser 成员是否真实的有效代码。它可能对方法有效,if (this.isBrowser) this.isBrowser()

使用 TypeScript 解决这个问题的一种方法是不要对条件偷懒

if (this.isBrowser === true && this.imageURL) {.....}

如果isBrowser 是一个函数,这将导致类型错误。

这是一个可能由不确定的代码样式引起的问题。如果一个检查它是否是浏览器的方法被称为isBrowser,那么布尔属性将如何被调用呢?方法和属性可以混淆并且不能共存的事实表明返回布尔值的方法可能具有不同的名称,例如getIsBrowser,而isBrowser 保留用于布尔值。

【讨论】:

  • 我认为这是一个命名约定问题。如果我使用的是吸气剂,它应该是isBrowser,如果它是一个函数getIsBrowser(带有动词)。谢谢
  • 查看约定并发现 Airbnb 样式指南出于多种原因说不要使用 getter/setter(因此可能会采用)github.com/airbnb/javascript#accessors
  • 您可能会遇到与没有 get/set 描述符的 isBrowser 属性相同的问题。我不会相信 Airbnb 风格指南所说的一切。它与任何其他风格指南一样有偏见,而且并非所有内容都有意义。 getter 方法和描述符都有其用途。还有就是get/set在TS中有问题,stackoverflow.com/a/50283765/3731501
  • 你链接的那个问题是关于 Angular 5 和 Typescript - 这正是我正在使用的!
  • 很高兴它有帮助。如您所见,get/set 访问器的缺点是如果没有 hack,继承将无法在 TS 中工作,但它是可行的。
猜你喜欢
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
相关资源
最近更新 更多