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

时间:2019-06-10 10:37:22

标签: typescript visual-studio-code tslint

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

#!/bin/bash
set -e
ROOT_DIR=$(dirname $(dirname $0))
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,也未遵循该规则。我在具有Windows主机的单独计算机上运行VSCode,并通过Linux VM提供的Samba挂载文件系统。对于安装和内置的规则,将遵守并显示文件中的其他规则,例如no-console等。

如何获取有关为什么未应用该规则的信息?我需要在插件中进行配置才能使其正常工作吗?

3 个答案:

答案 0 :(得分:0)

我认为这可能与问题有关。

  • 让我们将规则文件命名为noImportsRule.ts。规则在tslint.json中以其烤肉串大小写的标识符进行引用,因此"no-imports": true将配置规则。

  • 不能使用自定义实现覆盖核心规则。

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

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

重要约定:

  • 规则标识符始终用kebab大小写。
  • 规则文件始终使用驼峰式(camelCasedRule.ts)。
  • 规则文件必须包含后缀Rule
  • 导出的类必须始终命名为Rule并从Lint.Rules.AbstractRule扩展

针对所有details

答案 1 :(得分:0)

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

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

您当然可以先将规则编译为JS,但这不是您要的。

答案 2 :(得分:0)

我开发的骇客是这样的:

  1. 假设您的自定义规则位于./rules下,目录如下:
rules/
  |- registerRule.js
  |- oneRule.ts
  |- twoRule.ts
  1. oneRule.tstwoRule.ts是用打字稿编写的实际规则,但是registerRule.js是“间谍”。该间谍规则的目的只是为了让tslint实例自己将其拾取并将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
  }
}

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