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
- Convert string input with `Number(raw)` before asserting and handle NaN explicitly.
- If zero is acceptable, widen the contract (assert `value <= 0` yourself or use a non-positive check) instead of negative-number.
- 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
- NaN fails every comparison, so NaN is never negative — filter it out first with Number.isNaN
- Subtraction results can be 0 or -0 in edge cases; both are non-negative for v < 0 checks
- Numeric strings like '-5' are not numbers — convert with Number() and re-validate before asserting
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
- Expected value which is `integer`, received value of type `$
- Expected value which is `negative integer`, received value o
- Expected value which is `safe integer`, received value of ty
- Expected value which is `valid length`, received value of ty
- Expected value which is `even integer`, received value of ty
AI-assisted analysis of sindresorhus/is@7821031c66 (2026-07-31).
Data as JSON: /data/errors/a1d80ccb6d7e5d03.json.
Report an issue: GitHub ↗.