sindresorhus/is · error · TypeError

Expected value which is `negative number`, received value of

Error message

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

What it means

Thrown by `assertNegativeNumber()` (source/index.ts:1729) when the value fails `isNumber(value) && value < 0`. The value must be a number primitive strictly below zero; NaN, 0, -0, positive numbers, and numeric strings all fail (NaN fails both `isNumber` in this library and the `< 0` comparison).

Source

Thrown at source/index.ts:1731

		throw new TypeError(message ?? typeErrorMessage('NaN', value));
	}
}

export function assertNativePromise<T = unknown>(value: unknown, message?: string): asserts value is Promise<T> {
	if (!isNativePromise(value)) {
		throw new TypeError(message ?? typeErrorMessage('native Promise', value));
	}
}

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

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

export function assertNodeStream(value: unknown, message?: string): asserts value is NodeStream {
	if (!isNodeStream(value)) {
		throw new TypeError(message ?? typeErrorMessage('Node.js Stream', value));
	}
}

export function assertNonEmptyArray<T = unknown, Item = unknown>(value: T | Item[], message?: string): asserts value is [Item, ...Item[]] {
	if (!isNonEmptyArray(value)) {
		throw new TypeError(message ?? typeErrorMessage('non-empty array', value));
	}
}

export function assertNonEmptyMap<Key = unknown, Value = unknown>(value: unknown, message?: string): asserts value is Map<Key, Value> {
	if (!isNonEmptyMap(value)) {
		throw new TypeError(message ?? typeErrorMessage('non-empty map', value));

View on GitHub ↗ (pinned to 7821031c66)

Solutions

  1. Convert string input with `Number(raw)` before asserting and handle NaN explicitly.
  2. If zero is acceptable, widen the contract (assert `value <= 0` yourself or use a non-positive check) instead of negative-number.
  3. Audit the sign convention at the boundary where the value is produced — negate there if the source uses the opposite convention.

Example fix

// before
const delta = form.get('delta'); // '-2.5' (string)
assertNegativeNumber(delta); // throws
// after
const delta = Number(form.get('delta'));
assertNegativeNumber(delta);
Defensive patterns

Strategy: validation

Validate before calling

if (typeof value !== 'number' || Number.isNaN(value) || value >= 0) {
  throw new RangeError(`Expected negative number, got ${value}`);
}

Type guard

const isNegativeNumber = (v: unknown): v is number => typeof v === 'number' && v < 0;

Prevention

When it happens

Trigger: Calling `assertNegativeNumber()` with 0 or -0 (`-0 < 0` is false), a numeric string like '-2.5', NaN from a failed parse, or a positive number due to a sign error upstream.

Common situations: Boundary bugs where zero should count as valid; unparsed string input from forms/env/CLI; sign conventions flipping between systems (e.g. accounting credits vs debits, coordinate systems); `Math.abs` applied too early in a pipeline.

Related errors


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