Проверка AST для @Injectable декоратора для пользовательского правила TSLint - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь разработать собственное правило TSLint, которое позволит мне проверить и убедиться, что декоратор @Injectable не включен в классы, которые не внедряют какие-либо другие службы в себя через конструктор.

Я читал эту документацию и смог ранее написать правило, запрещающее модификаторы export в тестовых файлах, выполнив:

const hasExport = node.modifiers && node.modifiers.some(
    (modifier) => modifier.kind === SyntaxKind.ExportKeyword
);

Этот веб-сайт исследователя AST был полезен на протяжении всего этого процесса, но у меня возникают проблемы с выбором наилучшего способа выяснить, добавляется ли декоратор @Injectable к моему узлу.

Пока у меня есть:

const hasInjectableDecorator = node.decorators && node.decorators.some(
    (decorator) => decorator.kind === SyntaxKind.Decorator
);

Но при этом будет проверяться только наличие любого декоратора (@Injectable, @Component, @NgModule и т. Д.), И мне было интересно, как я мог тогда проверитьтекст, используя доступные свойства / методы в decorator, чтобы убедиться, что это действительно @Injectable.Я хотел бы начать с этого, а затем погрузиться в то, чтобы другие сервисы не вводились.

Спасибо

1 Ответ

0 голосов
/ 09 декабря 2018

+ 1 для astexplorer.net!Отличный веб-сайт.

импорт * в виде ts из "typcript";

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 вы должны использовать встроенный-in ts.isDecorator метод (и его эквиваленты для других типов синтаксиса узлов) .Они напрямую проверяют .kind таким же образом и также возвращают node is ts.Decorator, так что вы получите вывод типа без необходимости вручную приводить node as ts.Decorator позже.

...