如何在不编译为 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 是这样的:
- 假设您的自定义规则位于
./rules
下,目录如下所示:
rules/
|- registerRule.js
|- oneRule.ts
|- twoRule.ts
oneRule.ts
和 twoRule.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
- 设置
tslint.json
{
"rulesDirectory": "./rules",
"rules": {
"register": true,
"one": true,
"two": true
}
}
我已经测试过了。此 hack 将教会 vscode tslint 插件理解 .ts
自定义规则。
我有一个用 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 是这样的:
- 假设您的自定义规则位于
./rules
下,目录如下所示:
rules/
|- registerRule.js
|- oneRule.ts
|- twoRule.ts
oneRule.ts
和twoRule.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
- 设置
tslint.json
{
"rulesDirectory": "./rules",
"rules": {
"register": true,
"one": true,
"two": true
}
}
我已经测试过了。此 hack 将教会 vscode tslint 插件理解 .ts
自定义规则。