---
name: angular-access-modifiers-francisco-rangel
description: Enforces explicit TypeScript access modifiers (public/protected/private) on every class member of an Angular component, directive, or pipe based on usage.
---

# Angular Access Modifiers

Every field, getter/setter, and method on an Angular class must have an **explicit** TypeScript access modifier. Never leave members implicit.

## Visibility Rules

| Used in HTML template? | Used only inside TS class? | External access (Parent, Test, Service)? | Access Modifier |
| :--- | :--- | :--- | :--- |
| **Yes** | — | — | `protected` |
| **No** | **Yes** | **No** | `private` |
| **No** | — | **Yes** | `public` |

---

## Instructions

1. **`protected`**: Use for all properties, signals, getters/setters, and methods accessed directly inside the template (`.html` or inline `template`).
2. **`private`**: Use for internal logic, helper methods, state variables, or subscriptions that are never accessed outside this single file.
3. **`public`**: Use ONLY for `@Input()`, `@Output()`, component inputs/outputs created via functions (`input()`, `output()`), public API methods called by parents/tests, or Angular lifecycle hooks (`ngOnInit`, `ngOnDestroy`, etc.).
4. **Never leave any member without an explicit modifier.**

## Examples

### ❌ Incorrect (Implicit or misscoped)
```typescript
@Component({ ... })
export class UserProfileComponent {
  userName = signal('John'); // Implicit public (avoid)
  
  ngOnInit() { // Implicit public
    this.fetchData();
  }

  fetchData() { // Implicit public
    // ...
  }
}