- Use strict type checking
- Prefer type inference when the type is obvious
- Avoid the
anytype; useunknownwhen type is uncertain
- Always use standalone components over NgModules
- Must NOT set
standalone: trueinside Angular decorators. It's the default in Angular v20+. - Use signals for state management
- Implement lazy loading for feature routes
- Do NOT use the
@HostBindingand@HostListenerdecorators. Put host bindings inside thehostobject of the@Componentor@Directivedecorator instead - Use
NgOptimizedImagefor all static images.NgOptimizedImagedoes not work for inline base64 images.
- It MUST pass all AXE checks.
- It MUST follow all WCAG AA minimums, including focus management, color contrast, and ARIA attributes.
- Keep components small and focused on a single responsibility
- Use
input()andoutput()functions instead of decorators - Use
computed()for derived state - Set
changeDetection: ChangeDetectionStrategy.OnPushin@Componentdecorator - Prefer inline templates for small components
- Prefer Reactive forms instead of Template-driven ones
- Do NOT use
ngClass, useclassbindings instead - Do NOT use
ngStyle, usestylebindings instead - When using external templates/styles, use paths relative to the component TS file.
- Use signals for local component state
- Use
computed()for derived state - Keep state transformations pure and predictable
- Do NOT use
mutateon signals, useupdateorsetinstead
- Keep templates simple and avoid complex logic
- Use native control flow (
@if,@for,@switch) instead of*ngIf,*ngFor,*ngSwitch - Use the async pipe to handle observables
- Do not assume globals like (
new Date()) are available. - Do not write arrow functions in templates (they are not supported).
- Design services around a single responsibility
- Use the
providedIn: 'root'option for singleton services - Use the
inject()function instead of constructor injection
- NEVER use type assertions. Eg:
const x = value as Typeis forbidden. The only exception isas const. - NEVER use
anytype. - NEVER use the not null assertion operator (
!). Prefers the optional chaining operator (?.) or explicit checks. - Use type narrowing to check for not null or undefined values, such as
if (value !== null && value !== undefined). - Use
===instead of==. - Define return types explicitly for functions.
- When working with union types, use
neverto ensure that if new cases are added, TypeScript will throw an error if they are not handled. - Avoid type checking with
instanceof. Always prefer to specify types of variables, parameters and return values to leverage the full power of TypeScript features. - Prefer immutability with
readonly.
text-opacity-*→ Usetext-{color}/{opacity}insteadbg-opacity-*→ Usebg-{color}/{opacity}insteadborder-opacity-*→ Useborder-{color}/{opacity}insteadflex-grow-*→ Usegrow-*flex-shrink-*→ Useshrink-*decoration-slice→ Usebox-decoration-slice