检查AST是否为TSLint自定义规则的@Injectable装饰器

时间:2018-12-07 16:29:40

标签: angular abstract-syntax-tree tslint

我正在尝试设计一个自定义(")规则,该规则将允许我检查并确保$3装饰器未包含在不会通过以下方式向自身注入任何其他服务的类中构造函数。

我一直在阅读this文档,并且以前能够通过以下操作编写规则以禁止在测试文件中使用"修饰符:

TSLint

This AST explorer website在整个过程中一直很有帮助,但是我很难确定确定@Injectable装饰器是否已添加到我的节点的最佳方法。

到目前为止,我有:

export

但这只会检查它是否是任何装饰器(@ Injectable,@ Component,@ NgModule等),我想知道如何使用该装饰器检查文本。 const hasExport = node.modifiers && node.modifiers.some( (modifier) => modifier.kind === SyntaxKind.ExportKeyword ); 上的可用属性/方法以确保它确实是@Injectable。我想先从这一点开始,然后再深入研究以确保没有其他服务被注入。

谢谢

1 个答案:

答案 0 :(得分:1)

+1 for astexplorer.net!很棒的网站。

从“打字稿”中将*作为ts导入;

const hasInjectableDecorator = (node: ts.ClassDeclaration) => node.decorators
    && node.decorators.some(isInjectableDecorator);

const isInjectableDecorator = (decorator: ts.Decorator) => ts.isIdentifier(decorator.expression)
    && decorator.expression.text === "Injectable"

说明:您要检查装饰器的expression的文本值为"Injectable",对吗?此方法将检查装饰器是否为标识符(它是指变量),如果是,则检查其使用的文本名称。

有趣的事实:您应该使用内置的node.kind === ts.SyntaxKind.Decorator方法((以及其他节点语法的等效方法),而不是检查ts.isDecorator。他们以相同的方式直接检查.kind并返回node is ts.Decorator,因此您将获得类型推断,而无需稍后手动强制转换node as ts.Decorator