jsconfig.json option

noImplicitOverride

  • Default false
  • Since TypeScript 4.3

When a subclass method has the same name as a method in its base class, it replaces it. If the base method is later renamed, the subclass method quietly stops overriding anything. noImplicitOverride makes every override say so: in a .js file, with a JSDoc @override tag. A missing tag is TS4119.

Once overrides are marked, a tag on a method that overrides nothing is an error too, so renames in the base class surface right away. The option arrived with TypeScript 4.3, along with the override keyword, and is not part of strict.

At a glance

Write "noImplicitOverride": true in code with class hierarchies
On the command line --noImplicitOverride
Type boolean
Default in TypeScript 5.9 false
TypeScript's description Ensure overriding members in derived classes are marked with an override modifier.

The description is quoted from TypeScript's own option list (Apache-2.0); see the notices.

Examples

main.js Error confirmed 5.9.3 TypeScript 5.9.3, run 21 October 2026: main.js(11,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. main.js(11,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. main.js(11,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
class Shape {
  area() {
    return 0;
  }
}

export class Square extends Shape {
  side = 2;

  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 this.side ** 2;
  }
}

export class Circle extends Shape {
  radius = 1;

  /** @override */
  area() {
    return Math.PI * this.radius ** 2;
  }
}
noImplicitOverride on: an override without the @override tag.
jsconfig.json for this example
{
  "compilerOptions": {
    "checkJs": true,
    "noEmit": true,
    "strict": true,
    "target": "es2022",
    "module": "nodenext",
    "types": [],
    "noImplicitOverride": true
  },
  "include": [
    "*.js"
  ]
}
main.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
class Shape {
  area() {
    return 0;
  }
}

export class Square extends Shape {
  side = 2;

  area() {
    return this.side ** 2;
  }
}

export class Circle extends Shape {
  radius = 1;

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

Where the tag goes

Put /** @override */ on its own line above the method, as Circle does. A JSDoc comment on the same line as the class's opening brace is not attached to the method after it, so the check would still report it.

Gotchas

  • An @override tag on a method that overrides nothing is reported (TS4122) even without this option.

Sources

Last reviewed 20 October 2026.