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
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;
}
}jsconfig.json for this example
{
"compilerOptions": {
"checkJs": true,
"noEmit": true,
"strict": true,
"target": "es2022",
"module": "nodenext",
"types": [],
"noImplicitOverride": true
},
"include": [
"*.js"
]
} 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;
}
}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
@overridetag on a method that overrides nothing is reported (TS4122) even without this option.
Sources
- TSConfig Reference: noImplicitOverride · TypeScript
- TypeScript 4.3 release notes · TypeScript handbook
Last reviewed 20 October 2026.