簡體   English   中英

如何在不編譯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 $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等。

如何獲取有關未應用規則的原因的信息? 我需要在插件中配置一些東西來使其工作嗎?

這是我認為可能與問題有關的內容。

  • 讓我們將規則文件命名為noImportsRule.ts tslint.json中引用了tslint.json - tslint.json標識符的規則,因此"no-imports": true將配置規則。

  • 自定義實現不能覆蓋核心規則。

  • 自定義規則也可以像核心規則一樣接受選項(通過this.getOptions())檢索this.getOptions())

  • 從TSLint v5.7.0開始,您不再需要在使用它們之前編譯自定義規則。 你需要告訴node.js如何加載.ts文件,例如使用ts-node:

重要約定:

  • 規則標識符總是以kebab為基礎。
  • 規則文件總是以駝峰為基礎( camelCasedRule.ts )。
  • 規則文件必須包含后綴Rule
  • 導出的類必須始終命名為Rule並從Lint.Rules.AbstractRule擴展

了解所有細節

不幸的是,VScode / vscode-typescript-tslint-plugin不支持這一點,似乎沒有列入他們的議程。

這是他們的GitHub上一個封閉的問題,要求這個功能。

您當然可以先將規則編譯為JS,但這不是您要求的。

我開發的黑客是這樣的:

  1. 假設您的自定義規則位於./rules下,目錄如下所示:
rules/
  |- registerRule.js
  |- oneRule.ts
  |- twoRule.ts
  1. oneRule.tstwoRule.ts是用twoRule.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
  }
}

我測試過了。 這個hack會教vscode tslint插件來理解.ts自定義規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM