带有 @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

newnew ClassName

error  Unsafe construction of an any type value         @typescript-eslint/no-unsafe-call

如何避免这些错误?!我真的很希望能够遵守这些规则,因为我认为它们非常有用!

谢谢。


这是另一个例子:

import  readJsonSync  from 'fs-extra';
const testEnv = readJsonSync(testEnvPath);

这里我在const testEnvtestEnv 上收到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 文件中的 baseUrlpaths 定义正确。

@见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

要求语句不是导入语句的一部分。eslint@typescript-eslint/no-var-需要从存储中导入打字稿

如何将 typescript-eslint 规则添加到 eslint