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": {
"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": {
"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": {
"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';