捕捉打字稿语法错误:if 语句和类方法调用

Posted

技术标签:

【中文标题】捕捉打字稿语法错误:if 语句和类方法调用【英文标题】:Catching typescript syntax errors: if statements and class method calls 【发布时间】:2020-11-09 04:36:28 【问题描述】:

我在调试过程中注意到,我最难找到的笨拙错别字是如下结果语句:

if (id = userId) ..

And for class methods:

let result = myClass.doThis;

出于某种原因,VSCode 不会在编译时将这些标记为潜在问题。是否有设置或工具可以警告我此类错误?有时它们很难找到并且花费了我很多时间来追踪,因为它们在您扫描时并不那么明显并且难以搜索。

我知道这些是合法的打字稿语句,但其他一些语言的 UI 会标记条件中的赋值和称为属性的方法,以确保这确实是您想要做的。

【问题讨论】:

使用 linter。带有 typescript 插件的 eslint 是前进的方向,因为 tslint 现在已经贬值了。他们会抓住 if 的情况。但是,您的第二个示例是完全有效且合理的代码,因此我认为没有任何理由对其进行标记。如果类方法不带任何参数并且是同步的,请考虑将其设为属性访问器 我想知道在 let result=myClass.doThis; 中将类方法保存在变量中是多么有用。什么时候有用?如果“doThis”是一个依赖于类的任何其他属性的方法,那么如果没有实例的正确“this”上下文,调用 result() 将不会有多大好处。 好吧,有时你绑定它并传递,或者你正在创建某种适配器,但考虑object.member 的更一般情况,其中object 只是一些属性包。我几乎从不使用this,除非框架强迫我。无论如何,这些天的 linters 是高度可定制的,我敢肯定有人已经写过这样的规则,但我想除了推荐一个工具之外,我还会给你我的意见,因为好吧......我们正在谈论 linter :跨度> 谢谢。实际上让 ESLint 工作有困难,但我会继续摆弄。 【参考方案1】:

继@aluan-haddad 的 cmets 之后。

ESLint 有一条规则可以防止您的第一个问题 (if (id = userId) ...): no-cond-assign.

您的第二个问题 (let result = myClass.doThis;) 在没有更多信息的情况下很难说出最佳的 lint 规则。 就其本身而言,该代码没有任何问题 - 您已经将(我假设是)一个函数分配给了一个变量。

捕获此问题的一个选项可能是来自@typescript-eslintunbound-method 规则。但是,如果您使用自动绑定箭头函数方法,则此规则不会捕获任何内容。

如果您遇到从函数返回值的问题,那么 TS 应该主要为您处理这个问题。一种确保方法是通过以下@typescript-eslint 规则之一为您的函数强制执行严格的合同:

explicit-function-return-type explicit-module-boundary-types

如果您遇到if (myClass.doThis) ... 之类的问题,请查看此答案中的建议:https://***.com/a/63183129/3736051

【讨论】:

以上是关于捕捉打字稿语法错误:if 语句和类方法调用的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 lit-html 的打字稿编写测试时出现“语法错误:无法在模块外使用 import 语句”

如何在 Loopback 4(打字稿)中调用具有依赖注入的类的方法?

打字稿 + ES6 代理

打字稿和多个类

打字稿路由错误 - 没有重载匹配此调用

类型数组的打字稿错误:- 无法调用其类型缺少调用签名的表达式