Skip to content
Back to skills

Typescript Best Practices

ASecurity

Prefer composition and constructor injection when the base class is becoming large. Split each capability behind a small interface and make collaborators explicit: ```ts export interface UserRepository { findById(id: string): Promise<User | null>; } export interface AuditLogger { record(event: string): Promise<void>; } export interface User { readonly id: string; } export class UserService { public constructor( private readonly repository: UserRepository, private readonly auditLogger: AuditLo...

  • 549 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 5, 2026
development

Security analysis

A100/100

Pro scans all 11 files and shows the line behind each finding

Scanned September 5, 2026

npx -y skills add HoangNguyen0403/agent-skills-standard --skill typescript-best-practices --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Typescript Best Practices?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Typescript Best Practices
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/hoangnguyen0403-typescript-best-practices-cdb23929/badge)](https://www.skillsdirectory.com/skills/hoangnguyen0403-typescript-best-practices-cdb23929)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
Prefer composition and constructor injection when the base class is becoming large. Split each capability behind a small interface and make collaborators explicit:

```ts
export interface UserRepository {
  findById(id: string): Promise<User | null>;
}

export interface AuditLogger {
  record(event: string): Promise<void>;
}

export interface User {
  readonly id: string;
}

export class UserService {
  public constructor(
    private readonly repository: UserRepository,
    private readonly auditLogger: AuditLogger,
  ) {}

  public async load(id: string): Promise<User | null> {
    const user = await this.repository.findById(id);
    if (user) {
      await this.auditLogger.record(`user.loaded:${user.id}`);
    }
    return user;
  }
}
```

Move cohesive behavior into focused services or strategy objects and compose them in the caller. This keeps classes small and testable without a singleton or a deeper inheritance hierarchy; use `private`/`protected`/`public` deliberately and retain explicit return types.

Files in this skill

  • eval-1.baseline.md831 B
  • eval-1.with-skill.md891 B
  • eval-2.baseline.md877 B
  • eval-2.with-skill.md1.1 KB
  • eval-3.baseline.md1.1 KB
  • eval-3.with-skill.md1 KB
  • trigger-1.md140 B
  • trigger-2.md121 B
  • trigger-3.md104 B
  • trigger-4.md107 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…