---
title: Classes
description: TypeScript class features including access modifiers, abstract classes, and implements.
tokens: ~550
---

# Classes

Quick-return cheat sheet for TypeScript classes — syntax, modifiers, abstract classes, decorators, and gotchas.

## Common Syntax

```typescript
class App extends Base implements AppConfig, Serializable {
  env: string; // field
  displayName?: string; // optional field
  name!: string; // definite assignment (trust me, TS)
  #secrets: Map<string, string>; // runtime private
  roles = ["user"]; // default value
  readonly createdAt = new Date(); // readonly with default

  constructor(env: string, host: string) {
    super(host);
    this.env = env;
  }

  setName(name: string) {
    this.name = name;
  } // method
  verifyName = (name: string) => {
    /* ... */
  };

  // overloads
  sync(): Promise<{ ok: boolean }>;
  sync(cb: (result: string) => void): void;
  sync(cb?: (result: string) => void): void | Promise<{ ok: boolean }> {
    /* ... */
  }

  get version() {
    /* ... */
  } // getter
  set version(value: string) {
    /* ... */
  } // setter

  private makeRequest() {
    /* ... */
  } // type-only private
  protected handleRequest() {
    /* ... */
  } // accessible to subclasses

  static #instanceCount = 0; // static private field
  static create(env: string) {
    /* ... */
  } // static method
  static {
    this.#instanceCount = -1;
  } // static block
}
```

## Parameter Properties

Prefixing a constructor parameter with `public`, `protected`, `private`, or `readonly` automatically creates and assigns a matching instance field.

```typescript
class Endpoint {
  constructor(
    public host: string,
    public port: number,
    private readonly secret: string,
  ) {}
}

const ep = new Endpoint("localhost", 3000, "abc");
ep.host; // "localhost"
ep.port; // 3000
```

## Abstract Classes

```typescript
abstract class Transport {
  abstract send(data: string): Promise<void>;
  log(msg: string) {
    console.log(`[${this.constructor.name}] ${msg}`);
  }
}

class HttpTransport extends Transport {
  async send(data: string) {
    /* ... */
  }
}
```

## Decorators

```typescript
import { sealed, log, validate } from "mylib";

@sealed
class App {
  @log
  start() {
    /* ... */
  }

  @validate
  set config(value: string) {
    /* ... */
  }
}
```