Существует множество шаблонов кода, которые технически корректны для компилятора или среды выполнения, но могут иметь сложные нюансы или предостережения. Эти шаблоны могут не давать ожидаемого разработчиком эффекта, что часто приводит к ошибкам. Компилятор Angular включает "расширенную диагностику", которая выявляет многие из этих шаблонов, чтобы предупредить разработчиков о потенциальных проблемах и обеспечить соблюдение общих лучших практик в кодовой базе.
Диагностики
В настоящее время Angular поддерживает следующие расширенные диагностики:
| Код | Имя |
|---|---|
NG8101 |
invalidBananaInBox |
NG8102 |
nullishCoalescingNotNullable |
NG8103 |
missingControlFlowDirective |
NG8104 |
textAttributeNotBinding |
NG8105 |
missingNgForOfLet |
NG8106 |
suffixNotSupported |
NG8107 |
optionalChainNotNullable |
NG8108 |
skipHydrationNotStatic |
NG8109 |
interpolatedSignalNotInvoked |
NG8111 |
uninvokedFunctionInEventBinding |
NG8113 |
unusedStandaloneImports |
NG8114 |
unparenthesizedNullishCoalescing |
NG8115 |
uninvokedTrackFunction |
NG8116 |
missingStructuralDirective |
NG8117 |
uninvokedFunctionInTextInterpolation |
NG8021 |
deferTriggerMisconfiguration |
Настройка
Расширенные диагностики по умолчанию являются предупреждениями и не блокируют компиляцию. Каждая диагностика может быть настроена как:
| Категория ошибки | Эффект |
|---|---|
warning |
По умолчанию — компилятор выдает диагностику как предупреждение, но не блокирует компиляцию. Компилятор завершит работу со статусом 0, даже если есть предупреждения. |
error |
Компилятор выдает диагностику как ошибку и прерывает компиляцию. Компилятор завершит работу с ненулевым кодом статуса, если выдана одна или несколько ошибок. |
suppress |
Компилятор не выдает диагностику вообще. |
Строгость проверки можно настроить как опцию компилятора Angular:
{
"angularCompilerOptions": {
"extendedDiagnostics": {
"checks": {
"invalidBananaInBox": "suppress"
},
"defaultCategory": "error"
}
}
}
Поле checks сопоставляет имена отдельных диагностик с их соответствующей категорией.
См. Диагностики для получения полного списка расширенных диагностик и имен, используемых для их
настройки.
Поле defaultCategory используется для любых диагностик, которые явно не перечислены в checks.
Если оно не установлено, такие диагностики будут рассматриваться как warning.
Расширенная диагностика будет работать, когда включен strictTemplates.
Это необходимо, чтобы позволить компилятору лучше понимать типы шаблонов Angular и предоставлять точную и значимую
диагностику.
Семантическое версионирование
Команда Angular намерена добавлять или включать новые расширенные диагностики в минорных версиях Angular ( см. semver). Это означает, что обновление Angular может показать новые предупреждения в вашей существующей кодовой базе. Это позволяет команде быстрее поставлять функции и делать расширенную диагностику более доступной для разработчиков.
Однако установка "defaultCategory": "error" превратит такие предупреждения в жесткие ошибки.
Это может привести к тому, что обновление минорной версии вызовет ошибки компиляции, что может быть воспринято как
нарушение semver (критическое изменение).
Любые новые диагностики могут быть подавлены или понижены до предупреждений с помощью
вышеуказанной настройки, поэтому влияние новой диагностики должно быть минимальным для проектов,
которые по умолчанию рассматривают расширенную диагностику как ошибки.
Использование ошибки по умолчанию — очень мощный инструмент; просто помните об этом нюансе semver при решении, подходит
ли error в качестве значения по умолчанию для вашего проекта.
Новые диагностики
Команда Angular всегда открыта для предложений о новых диагностиках, которые могут быть добавлены. Расширенные диагностики, как правило, должны:
- Обнаруживать распространенные, неочевидные ошибки разработчиков в шаблонах Angular.
- Четко формулировать, почему этот шаблон может привести к багам или непреднамеренному поведению.
- Предлагать одно или несколько понятных решений.
- Иметь низкий, желательно нулевой, уровень ложных срабатываний.
- Применяться к подавляющему большинству приложений Angular (не быть специфичными для неофициальной библиотеки).
- Улучшать корректность или производительность программы (не стиль, эта ответственность ложится на линтер).
Если у вас есть идея для расширенной диагностики, которая соответствует этим критериям, рассмотрите возможность подачи запроса на функцию.