Back to Biomejs

noConstructorReturn

src/content/docs/linter/rules/no-constructor-return.mdx

latest5.1 KB
Original Source

import { Tabs, TabItem } from '@astrojs/starlight/components';

<Tabs> <TabItem label="JavaScript (and super languages)" icon="seti:javascript"> ## Summary - Rule available since: `v1.0.0` - Diagnostic Category: [`lint/correctness/noConstructorReturn`](/reference/diagnostics#diagnostic-category) - This rule is **recommended**, meaning it is enabled by default. - This rule doesn't have a fix. - The default severity of this rule is [**error**](/reference/diagnostics#error). - Sources: - Same as [`no-constructor-return`](https://eslint.org/docs/latest/rules/no-constructor-return)

How to configure

json
{
	"linter": {
		"rules": {
			"correctness": {
				"noConstructorReturn": "error"
			}
		}
	}
}

Description

Disallow returning a value from a constructor.

Returning a value from a constructor of a class is a possible error. Forbidding this pattern prevents errors resulting from unfamiliarity with JavaScript or a copy-paste error.

Only returning without a value is allowed, as it’s a control flow statement.

Examples

Invalid

js
class A {
    constructor() {
        return 0;
    }
}
<pre class="language-text"><code class="language-text">code-block.js:3:9 <a href="https://biomejs.dev/linter/rules/no-constructor-return">lint/correctness/noConstructorReturn</a> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ <strong><span style="color: Tomato;">✖</span></strong> <span style="color: Tomato;">The </span><span style="color: Tomato;"><strong>constructor</strong></span><span style="color: Tomato;"> should not </span><span style="color: Tomato;"><strong>return</strong></span><span style="color: Tomato;"> a value.</span> <strong>1 │ </strong>class A &#123; <strong>2 │ </strong> constructor() &#123; <strong><span style="color: Tomato;">&gt;</span></strong> <strong>3 │ </strong> return 0; <strong> │ </strong> <strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong> <strong>4 │ </strong> &#125; <strong>5 │ </strong>&#125; <strong><span style="color: lightgreen;">ℹ</span></strong> <span style="color: lightgreen;">The constructor is here:</span> <strong>1 │ </strong>class A &#123; <strong><span style="color: Tomato;">&gt;</span></strong> <strong>2 │ </strong> constructor() &#123; <strong> │ </strong> <strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong><strong><span style="color: Tomato;">^</span></strong> <strong><span style="color: Tomato;">&gt;</span></strong> <strong>3 │ </strong> return 0; <strong><span style="color: Tomato;">&gt;</span></strong> <strong>4 │ </strong> &#125; <strong> │ </strong> <strong><span style="color: Tomato;">^</span></strong> <strong>5 │ </strong>&#125; <strong>6 │ </strong> <strong><span style="color: lightgreen;">ℹ</span></strong> <span style="color: lightgreen;">Returning a value from a constructor may confuse users of the class.</span> </code></pre>

Valid

js
class A {
    constructor() {}
}
js
class B {
    constructor(x) {
        return;
    }
}

Using this rule in combination with the singleton pattern

Some people implement the singleton pattern in JavaScript by returning an existing instance from the constructor, which would conflict with this rule.

Instead, we advise to follow one of the suggestions described in this blog post: https://arendjr.nl/blog/2024/11/singletons-in-javascript/

</TabItem> </Tabs>