Skip to main content

no-constructor-state

Discourage assigning a simple initial state value in a class constructor.

Targeted pattern scope

This rule inspects direct constructor-body assignments to this.state with a recursively simple, side-effect-free initializer.

What this rule reports

The rule reports direct constructor-body this.state = value assignments when value is a literal, undefined, Infinity, NaN, or an array/object recursively composed from those values. Calls, spreads, array holes, and nested control-flow assignments are excluded.

Why this rule exists

Simple initial state is clearer as a class field, where its declaration and initial value are visible together.

❌ Incorrect

class Component {
constructor() {
this.state = { ready: false };
}
}

✅ Correct

class Component {
state = { ready: false };
}

Dynamic initialization remains valid:

class Component {
constructor() {
this.state = createInitialState();
}
}

Behavior and migration notes

This rule never auto-fixes. A class-field suggestion is available only when no other class fields exist and the assignment is the sole base-constructor statement, or immediately follows the sole super() statement in a derived constructor.

Moving an assignment to a class field can still change initialization order and changes assignment semantics to class-field definition semantics. Review the suggestion, particularly when an inherited setter named state exists.

ESLint flat config example

import etcMisc from "eslint-plugin-etc-misc";

export default [
{
plugins: { "etc-misc": etcMisc },
rules: { "etc-misc/no-constructor-state": "warn" },
},
];

When not to use it

Disable the rule when constructor assignment order or inherited setter behavior is intentional. The rule is not React-specific and applies to every class with a state property.

Package documentation

Rule catalog ID: R029

Further reading

Upstream inspiration

Clean-room modernization of eslint-plugin-no-constructor-bind, which also publishes the original no-constructor-state rule.

Additional resources

Adoption resources

  • Start at warning level in CI, then move to error after cleanup.
  • Apply suggestions individually and review class initialization order.