在 `@typescript-eslint/parser` AST 中获取超类引用

问题描述 投票:0回答:1

给定以下类层次结构:

class Foo {
  fooMember = 1;
}

class Bar extends Foo {
  barMember = 2;
}

@typescript-eslint/parser
的AST输出将
extends Foo
语句引用为具有以下属性的
superClass

superClass: Identifier {
  type: "Identifier",
  name: "Foo",
  range: [ 50 53 ]
}

是否可以从该条目中提取与

ClassDeclaration
对应的
Foo
?如果可以,如何提取?
如果导入扩展类,同样的解决方案也适用吗?

从概念上讲,这应该是可能的,因为 Typescript 可以正确推断错误,例如父子类之间的公私定义不匹配等。

typescript abstract-syntax-tree typescript-eslint
1个回答
0
投票

这是可能的,是的!但不仅仅是通过您正在寻找的 AST 节点。它需要使用类型信息来完成。您需要获取支持节点对应的

ts.Type
。有关类型的更多信息,请参阅 TypeScript 的使用编译器 API 文档

如果您正在使用类型化 lint 规则,则自定义规则 > 类型化规则 有您需要的文档。您将需要使用 typescript-eslint 解析器服务来检索节点的

ts.Type

create(context) {
  return {
    'ClassDeclaration[superClass]'(node) {
      // 1. Grab the parser services for the rule
      const services = ESLintUtils.getParserServices(context);

      // 2. Find the TS type for the ES node
      const type = services.getTypeAtLocation(node.superClass);
    }
  };
}

如果您手动解析代码,那么您可能需要更直接地使用编译器 API。

无论哪种方式,一旦你有了

ts.Type
(代码片段中的
type
变量),你可能还想检索支持
ts.Symbol
。有关符号与类型及其相关 API 的说明,请参阅使用编译器 API > 类型检查 API

顺便说一句,自从提出这个问题以来,typescript-eslint.io 上的游乐场就被创建了。它具有 ESTree 节点、TypeScript 节点、支持 TypeScript

ts.Type
类型以及其他一些细节的视图。 这是包含类代码的 Playground 链接。干杯!

© www.soinside.com 2019 - 2024. All rights reserved.