TypeScript error

TS4119: An override without the @override tag

  • Error TS4119
  • Reported with noImplicitOverride
  • Tested with TypeScript 5.9

error TS4119: This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class 'Shape'. is reported, with noImplicitOverride on, for a subclass member that has the same name as a base class member and is not marked as an override. In a .ts file the message asks for the override keyword (TS4114); in a .js file it asks for the JSDoc tag.

The point of the option is the other direction: once every override is marked, a base class method that is renamed or removed turns each @override below it into an error (TS4122) instead of silently leaving dead methods behind.

At a glance

CodeTS4119
MessageThis member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class '{0}'.
TypeScript's categoryerror
Listed underClasses, JSX and unused code
Turned on by noImplicitOverride
In .js files Reported when the file is checked: checkJs in jsconfig.json, or // @ts-check at the top of the file

The message is TypeScript's own text from its diagnostic messages file (Apache-2.0); {0} is filled in by tsc for each error.

What it looks like

shapes.js Error confirmed 5.9.3 TypeScript 5.9.3, run 21 October 2026: shapes.js(15,3): error TS4119: This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class 'Shape'. 6.0.3 TypeScript 6.0.3, run 21 October 2026: the same as 5.9.3. shapes.js(15,3): error TS4119: This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class 'Shape'. 7.0.2 TypeScript 7.0.2, run 21 October 2026: the same as 5.9.3. shapes.js(15,3): error TS4119: This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class 'Shape'. checked 21 October 2026
export class Shape {
  area() {
    return 0;
  }
}

export class Circle extends Shape {
  /** @param {number} radius */
  constructor(radius) {
    super();
    this.radius = radius;
  }

  area() {error TS4119: This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class 'Shape'.
    return Math.PI * this.radius ** 2;
  }
}
An overriding method without @override, under noImplicitOverride.
jsconfig.json for this example
{
  "compilerOptions": {
    "checkJs": true,
    "noEmit": true,
    "strict": true,
    "target": "es2022",
    "module": "nodenext",
    "types": [],
    "noImplicitOverride": true
  },
  "include": ["*.js"]
}

What causes it

  • noImplicitOverride is on (it is not part of strict).
  • A subclass method or property has the same name as one in its base class and no @override tag.

How to fix it

Add @override

/** @override */ on its own line above the method. If the method already has a JSDoc comment, add the tag to it.

shapes.js TypeScript 5.9.3 TypeScript 5.9.3, run 21 October 2026: No errors. 6.0.3 TypeScript 6.0.3, run 21 October 2026: the same as 5.9.3. No errors. 7.0.2 TypeScript 7.0.2, run 21 October 2026: the same as 5.9.3. No errors. checked 21 October 2026
export class Shape {
  area() {
    return 0;
  }
}

export class Circle extends Shape {
  /** @param {number} radius */
  constructor(radius) {
    super();
    this.radius = radius;
  }

  /** @override */
  area() {
    return Math.PI * this.radius ** 2;
  }
}
The override marked with @override.
jsconfig.json for this example
{
  "compilerOptions": {
    "checkJs": true,
    "noEmit": true,
    "strict": true,
    "target": "es2022",
    "module": "nodenext",
    "types": [],
    "noImplicitOverride": true
  },
  "include": ["*.js"]
}

Gotchas

  • The comment must be attached to the member: a JSDoc comment on the same line as the class's opening brace is not attached to the method after it.
  • Constructors are not overrides; constructor never needs the tag.

Sources

Last reviewed 20 October 2026.