sindresorhus/is · error · TypeError

Expected value which is `null`, received value of type `${is

Error message

Expected value which is `null`, received value of type `${is(value)}`.

What it means

Thrown by `assertNull()` (source/index.ts:1790) when the value is anything other than exactly `null`. This is a strict identity check — `undefined`, `0`, `''`, and `false` all fail. It's typically used to assert that something has NOT been set or was explicitly cleared.

Source

Thrown at source/index.ts:1792

	}
}

export function assertNonNegativeInteger(value: unknown, message?: string): asserts value is number {
	if (!isNonNegativeInteger(value)) {
		throw new TypeError(message ?? typeErrorMessage('non-negative integer', value));
	}
}

export function assertNonNegativeNumber(value: unknown, message?: string): asserts value is number {
	if (!isNonNegativeNumber(value)) {
		throw new TypeError(message ?? typeErrorMessage('non-negative number', value));
	}
}

// eslint-disable-next-line @typescript-eslint/no-restricted-types
export function assertNull(value: unknown, message?: string): asserts value is null {
	if (!isNull(value)) {
		throw new TypeError(message ?? typeErrorMessage('null', value));
	}
}

// eslint-disable-next-line @typescript-eslint/no-restricted-types
export function assertNullOrUndefined(value: unknown, message?: string): asserts value is null | undefined {
	if (!isNullOrUndefined(value)) {
		throw new TypeError(message ?? typeErrorMessage('null or undefined', value));
	}
}

export function assertNumber(value: unknown, message?: string): asserts value is number {
	if (!isNumber(value)) {
		throw new TypeError(message ?? typeErrorMessage('number', value));
	}
}

export function assertNumericString(value: unknown, message?: string): asserts value is `${number}` {
	if (!isNumericString(value)) {

View on GitHub ↗ (pinned to 7821031c66)

Solutions

  1. If either absent value is acceptable, use `assert.nullOrUndefined(value)` instead.
  2. Normalize at the boundary: `value ?? null` to convert `undefined` to `null` when that's the intended semantic.
  3. If the assertion is guarding 'this slot must be empty before reuse', find why the previous consumer didn't reset it to null.

Example fix

// before
assert.null_(cache.entry); // entry was never assigned → undefined → throws
// after
assert.nullOrUndefined(cache.entry); // accept both absent states
Defensive patterns

Strategy: type-guard

Validate before calling

if (value === null) {
  assert.null_(value);
}

Type guard

function isNull(v: unknown): v is null {
  return v === null;
}

Try / catch

try {
  assert.null_(result);
} catch (error) {
  if (error instanceof TypeError) {
    // result is undefined or a real value, not null — check what produced it
  }
  throw error;
}

Prevention

When it happens

Trigger: Calling `assert.null_(value)` / `assertNull(value)` with `undefined` (the most common confusion — e.g. a missing object property or uninitialized variable), or with any value when the code expected a cleared/absent state.

Common situations: APIs that use `undefined` for 'never set' but `null` for 'explicitly cleared' — asserting null on a property that was simply never assigned; DOM/library methods returning `undefined` where `null` was expected; state that should have been reset before reuse but wasn't.

Related errors


AI-assisted analysis of sindresorhus/is@7821031c66 (2026-07-31). Data as JSON: /data/errors/f1048bf248148e2c.json. Report an issue: GitHub ↗.