---
description: 'Enforce that class methods utilize `this`.'
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
> 🛑 This file is source code, not the primary documentation location! 🛑
>
> See **https://typescript-eslint.io/rules/class-methods-use-this** for documentation.
It adds support for ignoring `override` methods and/or methods on classes that implement an interface. It also supports auto-accessor properties.
## Options
This rule adds the following options:
```ts
interface Options extends BaseClassMethodsUseThisOptions {
ignoreOverrideMethods?: boolean;
ignoreClassesThatImplementAnInterface?: boolean | 'public-fields';
}
const defaultOptions: Options = {
...baseClassMethodsUseThisOptions,
ignoreOverrideMethods: false,
ignoreClassesThatImplementAnInterface: false,
};
```
### `ignoreOverrideMethods`
{/* insert option description */}
Example of correct code when `ignoreOverrideMethods` is set to `true`:
```ts option='{ "ignoreOverrideMethods": true }' showPlaygroundButton
abstract class Base {
abstract method(): void;
abstract property: () => void;
}
class Derived extends Base {
override method() {}
override property = () => {};
}
```
### `ignoreClassesThatImplementAnInterface`
{/* insert option description */}
If specified, it can be either:
- `true`: Ignore all classes that implement an interface
- `'public-fields'`: Ignore only the public fields of classes that implement an interface
Note that this option applies to all class members, not just those defined in the interface.
#### `true`
Examples of code when `ignoreClassesThatImplementAnInterface` is set to `true`:
```ts option='{ "ignoreClassesThatImplementAnInterface": true }' showPlaygroundButton
class Standalone {
method() {}
property = () => {};
}
```
```ts option='{ "ignoreClassesThatImplementAnInterface": true }' showPlaygroundButton
interface Base {
method(): void;
}
class Derived implements Base {
method() {}
property = () => {};
}
```
#### `'public-fields'`
Example of incorrect code when `ignoreClassesThatImplementAnInterface` is set to `'public-fields'`:
```ts option='{ "ignoreClassesThatImplementAnInterface": "public-fields" }' showPlaygroundButton
interface Base {
method(): void;
}
class Derived implements Base {
method() {}
property = () => {};
private privateMethod() {}
private privateProperty = () => {};
protected protectedMethod() {}
protected protectedProperty = () => {};
}
```
```ts option='{ "ignoreClassesThatImplementAnInterface": "public-fields" }'
interface Base {
method(): void;
}
class Derived implements Base {
method() {}
property = () => {};
}
```
## When Not To Use It
If your project dynamically changes `this` scopes around in a way TypeScript has difficulties modeling, this rule may not be viable to use.
You might consider using [ESLint disable comments](https://eslint.org/docs/latest/use/configure/rules#using-configuration-comments-1) for those specific situations instead of completely disabling this rule.