Skip to content

useNullishCoalescing

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

Enforce using the nullish coalescing operator (??) instead of logical or (||).

?? only checks for null and undefined, while || checks for any falsy value including 0, '', and false. The rule reports ||, ||=, and ternary patterns (x !== null ? x : y) when type analysis shows the left operand is possibly nullish.

invalid-or.ts
declare const maybeString: string | null;
const value = maybeString || 'default';
/invalid-or.ts:2:27 lint/nursery/useNullishCoalescing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Use ?? instead of ||.

1 │ declare const maybeString: string | null;
> 2 │ const value = maybeString || ‘default’;
^^
3 │

The || operator checks for all falsy values (including 0, ”, and false), while ?? only checks for null and undefined.

This rule is still being actively worked on, so it may be missing features or have rough edges. Visit https://github.com/biomejs/biome/issues/8043 for more information or to report possible bugs.

This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information.

invalid-or-undefined.ts
declare const maybeNumber: number | undefined;
const value = maybeNumber || 0;
/invalid-or-undefined.ts:2:27 lint/nursery/useNullishCoalescing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Use ?? instead of ||.

1 │ declare const maybeNumber: number | undefined;
> 2 │ const value = maybeNumber || 0;
^^
3 │

The || operator checks for all falsy values (including 0, ”, and false), while ?? only checks for null and undefined.

This rule is still being actively worked on, so it may be missing features or have rough edges. Visit https://github.com/biomejs/biome/issues/8043 for more information or to report possible bugs.

This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information.

invalid-or-assign.ts
declare let x: string | null;
x ||= 'default';
/invalid-or-assign.ts:2:3 lint/nursery/useNullishCoalescing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Use ??= instead of ||=.

1 │ declare let x: string | null;
> 2 │ x ||= ‘default’;
^^^
3 │

The ||= operator assigns when the left side is falsy, while ??= only assigns when it is null or undefined.

This rule is still being actively worked on, so it may be missing features or have rough edges. Visit https://github.com/biomejs/biome/issues/8043 for more information or to report possible bugs.

This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information.

declare const x: string | null;
const value = x !== null ? x : 'default';
code-block.ts:2:15 lint/nursery/useNullishCoalescing  FIXABLE  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Prefer ?? over a ternary expression checking for nullish.

1 │ declare const x: string | null;
> 2 │ const value = x !== null ? x : ‘default’;
^^^^^^^^^^
3 │

This rule is still being actively worked on, so it may be missing features or have rough edges. Visit https://github.com/biomejs/biome/issues/8043 for more information or to report possible bugs.

This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information.

Safe fix: Replace the ternary with ??.

1 1 declare const x: string | null;
2 - const·value·=·x·!==·null·?·x·:·default;
2+ const·value·=·x·??·default;
3 3

declare const x: string | null;
const value = x == null ? 'default' : x;
code-block.ts:2:15 lint/nursery/useNullishCoalescing  FIXABLE  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Prefer ?? over a ternary expression checking for nullish.

1 │ declare const x: string | null;
> 2 │ const value = x == null ? ‘default’ : x;
^^^^^^^^^
3 │

This rule is still being actively worked on, so it may be missing features or have rough edges. Visit https://github.com/biomejs/biome/issues/8043 for more information or to report possible bugs.

This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information.

Safe fix: Replace the ternary with ??.

1 1 declare const x: string | null;
2 - const·value·=·x·==·null·?·default·:·x;
2+ const·value·=·x·??·default;
3 3

declare const maybeString: string | null;
const value = maybeString ?? 'default';
declare const definiteString: string;
const value = definiteString || 'fallback';
declare const cond: string | null;
if (cond || 'fallback') {
console.log('in if');
}
declare let y: string | null;
y ??= 'default';

Ignore || expressions inside conditional test positions (if/while/for/do-while/ternary). Default: true.

biome.json
{
"linter": {
"rules": {
"nursery": {
"useNullishCoalescing": {
"level": "on",
"options": {
"ignoreConditionalTests": false
}
}
}
}
}
}
declare const cond: string | null;
if (cond || 'fallback') {}

Ignore ternary expressions that check for null or undefined. Default: false.

biome.json
{
"linter": {
"rules": {
"nursery": {
"useNullishCoalescing": {
"level": "on",
"options": {
"ignoreTernaryTests": true
}
}
}
}
}
}
declare const x: string | null;
const value = x !== null ? x : 'default';

Ignore || and ||= whose connected logical tree also contains a &&. Default: false.

biome.json
{
"linter": {
"rules": {
"nursery": {
"useNullishCoalescing": {
"level": "on",
"options": {
"ignoreMixedLogicalExpressions": true
}
}
}
}
}
}

|| and ||= are still reported when the surrounding logical tree does not contain &&.

invalid-mixed-or.ts
declare const maybeString: string | null;
const value = maybeString || 'default';
/invalid-mixed-or.ts:2:27 lint/nursery/useNullishCoalescing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Use ?? instead of ||.

1 │ declare const maybeString: string | null;
> 2 │ const value = maybeString || ‘default’;
^^
3 │

The || operator checks for all falsy values (including 0, ”, and false), while ?? only checks for null and undefined.

This rule is still being actively worked on, so it may be missing features or have rough edges. Visit https://github.com/biomejs/biome/issues/8043 for more information or to report possible bugs.

This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information.

invalid-mixed-or-assign.ts
declare let assigned: string | null;
assigned ||= 'default';
/invalid-mixed-or-assign.ts:2:10 lint/nursery/useNullishCoalescing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Use ??= instead of ||=.

1 │ declare let assigned: string | null;
> 2 │ assigned ||= ‘default’;
^^^
3 │

The ||= operator assigns when the left side is falsy, while ??= only assigns when it is null or undefined.

This rule is still being actively worked on, so it may be missing features or have rough edges. Visit https://github.com/biomejs/biome/issues/8043 for more information or to report possible bugs.

This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information.

|| and ||= mixed with && in the same logical tree are not reported.

declare const a: string | null;
declare const b: string;
const r = (a || 'default') && b;
declare const b: string;
declare let assigned: string | null;
assigned ||= b && 'fallback';

Ignore || and ||= used inside a Boolean() call, where coalescing on falsy values is intentional. Default: false.

biome.json
{
"linter": {
"rules": {
"nursery": {
"useNullishCoalescing": {
"level": "on",
"options": {
"ignoreBooleanCoercion": true
}
}
}
}
}
}

|| and ||= outside a Boolean() call are still reported.

invalid-boolean-coercion.ts
declare const maybeString: string | null;
const value = maybeString || 'default';
/invalid-boolean-coercion.ts:2:27 lint/nursery/useNullishCoalescing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Use ?? instead of ||.

1 │ declare const maybeString: string | null;
> 2 │ const value = maybeString || ‘default’;
^^
3 │

The || operator checks for all falsy values (including 0, ”, and false), while ?? only checks for null and undefined.

This rule is still being actively worked on, so it may be missing features or have rough edges. Visit https://github.com/biomejs/biome/issues/8043 for more information or to report possible bugs.

This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information.

|| and ||= inside a Boolean() call are not reported.

valid-boolean-coercion.ts
declare const a: string | null;
declare const b: string;
const r = Boolean(a || b);

Ignore ||, ||=, and ternary expressions when every non-nullish variant of the operand is a primitive the option opts out of. Use true to ignore all primitives, or an object selecting string, number, boolean, or bigint. Default: none.

biome.json
{
"linter": {
"rules": {
"nursery": {
"useNullishCoalescing": {
"level": "on",
"options": {
"ignorePrimitives": {
"string": true
}
}
}
}
}
}
}

Primitive kinds that are not opted out of are still reported.

invalid-primitives.ts
declare const count: number | null;
const value = count || 0;
/invalid-primitives.ts:2:21 lint/nursery/useNullishCoalescing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Use ?? instead of ||.

1 │ declare const count: number | null;
> 2 │ const value = count || 0;
^^
3 │

The || operator checks for all falsy values (including 0, ”, and false), while ?? only checks for null and undefined.

This rule is still being actively worked on, so it may be missing features or have rough edges. Visit https://github.com/biomejs/biome/issues/8043 for more information or to report possible bugs.

This rule belongs to the nursery group, which means it is not yet stable and may change in the future. Visit https://biomejs.dev/linter/#nursery for more information.

A string operand is not reported when string is ignored.

valid-primitives.ts
declare const name: string | null;
const value = name || 'default';