Tslint: 没有未使用的变量类型错误:无法读取 null 的属性“1”

创建于 2018-05-17  ·  14评论  ·  资料来源: palantir/tslint

错误报告

  • __TSLint 版本__:5.10.0
  • __打字稿版本__:2.8.1
  • __通过__运行TSLint:CLI

正在整理 TypeScript 代码

import { A, B, C } from './file';

console.log('No imports used');

export const D = 4;

使用tslint.json配置:

{
  "rules": {
    "no-unused-variable": [true, {"ignore-pattern": "^_"}]
  }
}

实际行为

The 'no-unused-variable' rule threw an error in '/Users/andrew.mitchell/Documents/Projects/test/test.ts':
TypeError: Cannot read property '1' of null
    at walk (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/rules/noUnusedVariableRule.js:105:54)
    at Rule.AbstractRule.applyWithFunction (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/language/rule/abstractRule.js:39:9)
    at Rule.applyWithProgram (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/rules/noUnusedVariableRule.js:32:21)
    at Linter.applyRule (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:194:29)
    at /Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:139:85
    at Object.flatMap (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/utils.js:151:29)
    at Linter.getAllFailures (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:139:32)
    at Linter.lint (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:99:33)
    at /Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/runner.js:209:32
    at step (/Users/andrew.mitchell/Documents/test/node_modules/tslint/node_modules/tslib/tslib.js:133:27)

预期行为

规则应该为第 1 行警告All imports in import declaration are unused.

这是由noUnusedVariableRule.ts#L123引起的,因为failure消息是All imports in import declaration are unused. ,其中没有变量名称供正则表达式查找。

如果未指定ignore-pattern选项,此规则将正常工作,因为它不会尝试检查变量名称。

Fixed Bug

最有用的评论

compilerOptions定义noUnusedLocalsnoUnusedParameters与 tslint 的no-unused-variable不太一样。 到目前为止,未使用的变量要么使构建崩溃,要么不被注意,并且不再有警告模式 😞

所有14条评论

好找到@hotforfeature。 我开始在https://github.com/palantir/tslint/pull/3919 中解决这个问题,因为它与 TS 2.9 中出现的一些变化有关,这只会加剧这个问题。

我的 PR 防止抛出异常,但是,在您提到的情况下,它只是忽略了ignorePattern ,这不是很好。 我相信我们需要添加一些复杂的代码,就像我们现在为导入自动修复所做的那样:/

我想知道我们是否应该弃用这条规则。 tsc 现在提供了一种忽略其警告的方法,并支持通过 IDE 自动修复其警告。

据我所知,这条规则的主要好处是ignore-pattern ,但是很难按照现在编写规则以依赖于 tsc 诊断的方式正确实现它。 在禁用某些文件中的规则方面,TSLint 也比 tsc 更灵活一些。 @suchanlee 对这一切有什么想法吗? 我知道你最近修正了这个规则

我这条规则的主要用例是在 linting 时自动修复 git 钩子中提交的问题。 所以我仍然认为即使 tsc 通过 IDE 集成提供了一些东西,这里也有很大的价值。

@JKillian我认为随着 TSLint 支持多个版本的 Typescript 以及 Typescript 行为的持续变化,支持规则开始变得越来越昂贵。 由于 Typescript 支持该功能,我们应该倾向于使用它。 但由于早期版本的 TS 不支持它,我认为我们不应该删除它。 但是我认为我们应该开始考虑弃用规则并与 TS 人员合作,以更好地支持当前的 TSLint 工作流与 TS。

我会支持@suchanlee的提议。 这条规则似乎经常出现在问题中。 考虑到最近的 TS 版本充分警告了这个问题,太多了。 让我们逐步淘汰它!

@hotforfeature - 确认您的用例并认为它合理。 但是,由于规则的复杂性,我认为我们将弃用它(参见 #3919)。

与往常一样,欢迎任何人复制规则的源代码并将其移动到外部包,并继续以这种方式使用/改进它!

物有所值:

{
  "compilerOptions":  {
    "noUnusedLocals": true,
    "noUnusedParameters": true,
  }
}

tsconfig使用上述内容可以禁用no-unused-variable lint 规则。

no-unused-variable现在已弃用,上面的compilerOptions现在是官方解决方案。

compilerOptions定义noUnusedLocalsnoUnusedParameters与 tslint 的no-unused-variable不太一样。 到目前为止,未使用的变量要么使构建崩溃,要么不被注意,并且不再有警告模式 😞

@giladgray@killtheliterate写道:

在 tsconfig 中使用上述内容允许禁用 no-unused-variable lint 规则。

我不想禁用此规则,因为正如@kachkaev所写

compilerOptions定义noUnusedLocalsnoUnusedParameters与 tslint 的no-unused-variable不太一样

我的用例是生成的代码。 我希望我手动编写的代码遵循此规则,但为了避免使代码生成器变得非常复杂,我想在生成的代码中(或至少在生成的代码的某些部分)中禁用此规则-这是可以的不用 TypeScript 编译器选项来完成 😞

至少,这种弃用应该记录在TSLint 网站上,但我强烈同意这种弃用还为时过早。 有重新考虑的计划吗? 会接受社区贡献吗?

这种贬低是荒谬的。 编译器标志是一个可怕的替代品。 他们破坏了构建并且不会自行修复。 这是如何为人们指出合理的解决方案? 如果ignore-pattern选项现在很难生效,请弃用它。

👋 伙计们 - 只需将其链接到https://github.com/palantir/tslint/issues/4232。 很好理解并同意内置编译器选项_不_足以替代no-unused-variable 。 该规则的原始实现与其他 TS 工具不能很好地配合使用,必须被禁用。 #4232 跟踪找到重新启用它的方法。

同时,您可以使用tsc --noEmit --noUnusedLocals --noUnusedParameters作为单独的工具来使用内置检查。 是的,这不如可配置的no-unused-variables

继续讨论 #4100 & #4232

此页面是否有帮助?
0 / 5 - 0 等级