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
| Code | TS4119 |
|---|---|
| Message | This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class '{0}'. |
| TypeScript's category | error |
| Listed under | Classes, 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
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;
}
}jsconfig.json for this example
{
"compilerOptions": {
"checkJs": true,
"noEmit": true,
"strict": true,
"target": "es2022",
"module": "nodenext",
"types": [],
"noImplicitOverride": true
},
"include": ["*.js"]
} What causes it
noImplicitOverrideis on (it is not part ofstrict).- A subclass method or property has the same name as one in its base class and no
@overridetag.
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.
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;
}
}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;
constructornever needs the tag.
Sources
- JSDoc Reference: @override · TypeScript handbook
- TSConfig Reference: noImplicitOverride · TypeScript
- diagnosticMessages.json (TypeScript 5.9.3) · TypeScript on GitHub
Last reviewed 20 October 2026.