ESLint、indent 和ignoreNodes - 使 AST 选择器正常工作时出现问题

ksh*_*ine 1 javascript abstract-syntax-tree typescript eslint

由于 TSLint 已被弃用,我正在将项目转换为使用 ESLint。

我想设置我的缩进规则以允许这样做:

type HtmlColor = 'attrib' | 'background' | 'bg_whitespace' | 'comment' | 'entity' | 'error' | 'foreground' |
                 'invalid' | 'markup' | 'tag' | 'value' | 'warning' | 'whitespace';
Run Code Online (Sandbox Code Playgroud)

我目前收到关于第二行缩进的错误,它应该是 0 个空格而不是 17 个。我可能预计该错误会抱怨它不是 2 个空格,但肯定不是 0。

无论如何,如果我无法获得我想要识别的特定缩进,我至少希望在这种情况下忽略缩进。

我尝试使用ignoredNodesESLintindent规则的选项来修复此问题,如下所示:

    "@typescript-eslint/indent": [
      "error",
      2,
      {
        "ArrayExpression": "first",
        "FunctionDeclaration": { parameters: "first" },
        "ignoredNodes": [
          "ArrowFunction > Block",
          "NoSubstitutionTemplateLiteral",
          "TemplateLiteral",
          "TypeAliasDeclaration *"
        ],
        "ObjectExpression": "first",
        "VariableDeclarator": "first",
        "SwitchCase": 1
      }
    ],
Run Code Online (Sandbox Code Playgroud)

我可以看到列表的一部分ignoredNodes按照我的预期工作,例如 部分"TemplateLiteral",但我无法找出正确的 AST 语法来处理声明type,以及箭头函数等其他内容。

我已经使用AST Explorer来帮助找出 AST 选择器应该是什么,但到目前为止还没有运气。

ksh*_*ine 5

我找到了我正在寻找的语法:

        "ignoredNodes": [
          "ArrowFunctionExpression > BlockStatement",
          "NoSubstitutionTemplateLiteral",
          "TemplateLiteral",
          "TSTypeAliasDeclaration *"
        ],
Run Code Online (Sandbox Code Playgroud)

诀窍是意识到AST Explorer的不同设置会为相同的 TypeScript 语言结构生成不同的节点名称!直到我专门将 AST Explorer 设置为使用@typescript-eslint/parser,而不仅仅是typescript,以及“ESLint v4”的转换,我在从 TypeScript 代码生成的解析树中得到了错误的选择器名称。