如何在不编译为 JS 的情况下使用带有 vscode-tslint 的用 TypeScript 编写的自定义 tslint 规则?

How can I use a custom tslint rule written in TypeScript with vscode-tslint without compiling to JS?

我有一个用 TypeScript 为 TSlint 编写的自定义规则,我可以 运行 在我的 Linux VM 上使用的脚本中使用 ts-node

#!/bin/bash
set -e
ROOT_DIR=$(dirname $(dirname [=11=]))
cd $ROOT_DIR
find "$ROOT_DIR/src" -name "*.ts" -o -name "*.tsx" | xargs $(yarn bin)/ts-node $(yarn bin)/tslint

这使 tslint 直接 运行 TS 规则无需先编译,它确实有效。

问题是 ms-vscode.vscode-typescript-tslint-plugin 没有选择该规则,即使它在 tsconfig.json 规则中明确启用。我 运行ning VSCode 在一台带有 Windows 主机的单独机器上,通过 Linux 虚拟机提供的 Samba 安装文件系统。文件中的其他规则被尊重并显示为已安装和内置规则,如 no-console

如何获取有关未应用规则的原因的信息?我需要在插件中配置什么才能使它工作吗?

以下是我认为可能与问题有关的内容。

  • 让我们将规则文件命名为noImportsRule.ts。规则在 tslint.json 中使用其 kebab-cased 标识符引用,因此 "no-imports": true 将配置规则。

  • 无法用自定义实现覆盖核心规则。

  • 自定义规则也可以像核心规则一样接受选项(通过 this.getOptions())

  • 从 TSLint v5.7.0 开始,您不再需要在使用自定义规则之前对其进行编译。您需要告诉 node.js 如何加载 .ts 文件,例如使用 ts-node:

重要约定:

  • 规则标识符总是 kebab-cased。
  • 规则文件总是 camel-cased (camelCasedRule.ts)。
  • 规则文件必须包含后缀 Rule.
  • 导出的 class 必须始终命名为 Rule 并从 Lint.Rules.AbstractRule
  • 扩展

所有 details

不幸的是,这不受 VScode/vscode-typescript-tslint-plugin 支持并且似乎不在他们的议程中。

Here is a closed issue on their GitHub asking for this feature.

你当然可以先把你的规则编译成JS,但这不是你要求的。

我开发的 hack 是这样的:

  1. 假设您的自定义规则位于 ./rules 下,目录如下所示:
rules/
  |- registerRule.js
  |- oneRule.ts
  |- twoRule.ts
  1. oneRule.tstwoRule.ts 是用打字稿写的实际规则,但 registerRule.js 是 "spy"。这个间谍规则的目的只是通过 tslint 实例获取自身 picked-up 并将 ts-node/register 注入节点运行时。
// registerRule.js

require('ts-node/register')

const Lint = require('tslint')

class Rule extends Lint.Rules.AbstractRule {
  apply(sourceFile) {
    return []
  }
}

module.exports.Rule = Rule
  1. 设置tslint.json
{
  "rulesDirectory": "./rules",
  "rules": {
    "register": true,
    "one": true,
    "two": true
  }
}

我已经测试过了。此 hack 将教会 vscode tslint 插件理解 .ts 自定义规则。