# TSR1304: '…' can throw '…', which '…' (the member it overrides or implements) does not declare.

> An overriding or implementing method can throw something the member it overrides doesn't declare. Catch it, or declare it on the base.

## What it means

Code that calls a method through its base type only handles what the base declares. In sound mode an overriding or implementing method may not throw more than the member it overrides or implements declares. It's reported at the member name.

## Example

```ts
// An override that can throw something the base method doesn't declare.
class NotFound extends Error {
  readonly code = "NOT_FOUND";
}
class Timeout extends Error {
  readonly code = "TIMEOUT";
}
class Base {
  /** @throws {NotFound} */
  get(id: string): string {
    if (id === "") throw new NotFound("missing");
    return id;
  }
}
class Remote extends Base {
  /** @throws {NotFound | Timeout} */
  override get(id: string): string { // @expect TSR1304
    if (id === "slow") throw new Timeout("slow");
    return super.get(id);
  }
}
export const v: string = new Remote().get("a");
```

## How to fix

- Catch the extra exception in the override.
- Or add it to the base member's `@throws` tags, so every caller handles it.

Sound mode is defined in [design record 0007](https://github.com/Webb-Ventures/typescript-rust/blob/main/docs/design/0007-sound-mode.md) (accepted 2026-10-15).

Source: https://ts-r.dev/errors/TSR1304/
