Skip to content

noNonNullAssertedOptionalChain

biome.json
{
"linter": {
"rules": {
"nursery": {
"noNonNullAssertedOptionalChain": "error"
}
}
}
}

Disallow non-null assertions after optional chaining expressions.

Optional chaining (?.) is designed to return undefined if the object is null or undefined. Using a non-null assertion (!) immediately after optional chaining defeats the purpose of optional chaining and can lead to runtime errors.

obj?.prop!;
<pre class="language-text"><code class="language-text">code-block.ts:1:1 <a href="https://biomejs.dev/linter/rules/no-non-null-asserted-optional-chain">lint/nursery/noNonNullAssertedOptionalChain</a> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br /><br /> <strong><span style="color: Tomato;">✖</span></strong> <span style="color: Tomato;">Forbidden non-null assertion after optional chaining.</span><br /> <br /> <strong><span style="color: Tomato;">&gt;</span></strong> <strong>1</strong>obj?.prop!;<br /> <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><br /> <strong>2</strong><br /> <br /> <strong><span style="color: lightgreen;">ℹ</span></strong> <span style="color: lightgreen;">Optional chaining already handles nullish values. Using non-null assertion defeats its purpose and may cause runtime errors.</span><br /> <br /> <strong><span style="color: lightgreen;">ℹ</span></strong> <span style="color: lightgreen;">Consider using the nullish coalescing operator `??` or optional chaining throughout the chain instead.</span><br /> <br /></code></pre>
obj?.method()!.prop;
<pre class="language-text"><code class="language-text">code-block.ts:1:1 <a href="https://biomejs.dev/linter/rules/no-non-null-asserted-optional-chain">lint/nursery/noNonNullAssertedOptionalChain</a> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br /><br /> <strong><span style="color: Tomato;">✖</span></strong> <span style="color: Tomato;">Forbidden non-null assertion after optional chaining.</span><br /> <br /> <strong><span style="color: Tomato;">&gt;</span></strong> <strong>1</strong>obj?.method()!.prop;<br /> <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><br /> <strong>2</strong><br /> <br /> <strong><span style="color: lightgreen;">ℹ</span></strong> <span style="color: lightgreen;">Optional chaining already handles nullish values. Using non-null assertion defeats its purpose and may cause runtime errors.</span><br /> <br /> <strong><span style="color: lightgreen;">ℹ</span></strong> <span style="color: lightgreen;">Consider using the nullish coalescing operator `??` or optional chaining throughout the chain instead.</span><br /> <br /></code></pre>
obj?.[key]!.method();
<pre class="language-text"><code class="language-text">code-block.ts:1:1 <a href="https://biomejs.dev/linter/rules/no-non-null-asserted-optional-chain">lint/nursery/noNonNullAssertedOptionalChain</a> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br /><br /> <strong><span style="color: Tomato;">✖</span></strong> <span style="color: Tomato;">Forbidden non-null assertion after optional chaining.</span><br /> <br /> <strong><span style="color: Tomato;">&gt;</span></strong> <strong>1</strong>obj?.[key]!.method();<br /> <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><br /> <strong>2</strong><br /> <br /> <strong><span style="color: lightgreen;">ℹ</span></strong> <span style="color: lightgreen;">Optional chaining already handles nullish values. Using non-null assertion defeats its purpose and may cause runtime errors.</span><br /> <br /> <strong><span style="color: lightgreen;">ℹ</span></strong> <span style="color: lightgreen;">Consider using the nullish coalescing operator `??` or optional chaining throughout the chain instead.</span><br /> <br /></code></pre>
obj?.prop;
obj!.prop?.method();
obj?.prop ?? defaultValue;