给定以下类层次结构:
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 可以正确推断错误,例如父子类之间的公私定义不匹配等。
这是可能的,是的!但不仅仅是通过您正在寻找的 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 链接。干杯!