带有 @typescript-eslint/no-unsafe-* 规则的新 eslint 错误
Posted
技术标签:
【中文标题】带有 @typescript-eslint/no-unsafe-* 规则的新 eslint 错误【英文标题】:New eslint errors with the @typescript-eslint/no-unsafe-* rules 【发布时间】:2020-10-01 05:10:43 【问题描述】:我在将它们添加到一些现有项目时遇到了一些问题。例如,我开发的模块中有一个类:
export default class ClassName
// Class members
现在我将它导入另一个项目:
import ClassName from 'modulename';
const object = new ClassName();
我在这条线上有 2 个错误。
在const object
中的object
:
error Unsafe assignment of an any value @typescript-eslint/no-unsafe-assignment
在new
中new ClassName
:
error Unsafe construction of an any type value @typescript-eslint/no-unsafe-call
如何避免这些错误?!我真的很希望能够遵守这些规则,因为我认为它们非常有用!
谢谢。
这是另一个例子:
import readJsonSync from 'fs-extra';
const testEnv = readJsonSync(testEnvPath);
这里我在const testEnv
的testEnv
上收到no-unsafe-assignment
错误,在第二行的readJsonSync
调用上出现no-unsafe-call
错误。
我可以用这段代码摆脱第一个:
interface ITestEnv
// interface members
const testEnv: ITestEnv = readJsonSync(testEnvPath) as ITestEnv;
但是,我仍然不知道如何在readJsonSync
通话中摆脱第二个。
【问题讨论】:
我遇到了类似的问题。我的想法是在我的项目中使用 javascript,因为 typescript 带来了很多痛苦 【参考方案1】:在第一种情况下,您只有一个来自构造函数的错误,它级联到 const 赋值。您的类实现中的某些内容正在将类型推断推断为any
。
并不是说您的代码不正确。可能是这样,但有一个 (open issue on Github) 报告构造函数被同一规则错误地标记。
在您的第二个问题上,您是否添加了@type/fs-extra 作为项目依赖项?许多 npm 包本身没有类型。类型由某人创建并添加到 @types 库。在这种情况下,@types/package_name
必须单独添加为依赖项。
【讨论】:
确实,我有这个想法并添加了@types/fs-extra
模块作为依赖项;它没有帮助。还有一个想法:肯定有模块没有定义类型,无论是在模块中还是在@types
系列中……那我们该怎么办?这个 eslint 规则会阻止我们在 typescript 项目中使用该模块吗?!
如果类型不可用,我们总是可以编写自己的接口和类型并使用它们。如果我们希望编译器完成它的工作并检查所有内容,我们必须有类型。但是,当我们可能想要编辑规则以生成警告而不是错误时,当然可能会出现这种情况。类型检查是一种权衡:我们为了安全而放弃了便利。但最终由团队或开发人员决定 eslint 应该执行哪些规则。
你为什么使用句子“你的类实现中的某些东西正在使类型推断被推断为任何。”在Something的一部分中?......究竟是什么让它发生?在我看来,这句话读起来有点模糊。【参考方案2】:
ESlint 无法解析你的模块的绝对导入,
这使它可以将您的类类型推断为any
。
确保 ESlint 使用的 tsconfig.json 文件中的 baseUrl
和 paths
定义正确。
@见Typescript – Module Resolution
【讨论】:
它没有帮助我:(以上是关于带有 @typescript-eslint/no-unsafe-* 规则的新 eslint 错误的主要内容,如果未能解决你的问题,请参考以下文章
如何禁用@typescript-eslint/no-non-null-assertion 规则
使用内联注释禁用 typescript-eslint 插件规则(no-explicit-any)
ES2015 模块语法优于自定义 TypeScript 模块和命名空间@typescript-eslint/no-namespace
Vue 3 @typescript-eslint/no-unsafe-member-access