sindresorhus/is · error · TypeError

Expected value which is `finite number`, received value of t

Error message

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

What it means

Thrown by `assertFiniteNumber` (source/index.ts:1614) when the value is not a finite number — i.e. it fails `Number.isFinite`. Non-numbers, `NaN`, `Infinity`, and `-Infinity` all fail. This guards arithmetic pipelines against silent NaN/Infinity propagation, which the library's fail-fast philosophy treats as an immediate error.

Source

Thrown at source/index.ts:1616

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

export function assertEvenInteger(value: number, message?: string): asserts value is number {
	if (!isEvenInteger(value)) {
		throw new TypeError(message ?? typeErrorMessage('even integer', value));
	}
}

export function assertFalsy(value: unknown, message?: string): asserts value is Falsy {
	if (!isFalsy(value)) {
		throw new TypeError(message ?? typeErrorMessage('falsy', value));
	}
}

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

export function assertFloat32Array(value: unknown, message?: string): asserts value is Float32Array {
	if (!isFloat32Array(value)) {
		throw new TypeError(message ?? typeErrorMessage('Float32Array', value));
	}
}

export function assertFloat64Array(value: unknown, message?: string): asserts value is Float64Array {
	if (!isFloat64Array(value)) {
		throw new TypeError(message ?? typeErrorMessage('Float64Array', value));
	}
}

export function assertFormData(value: unknown, message?: string): asserts value is FormData {
	if (!isFormData(value)) {
		throw new TypeError(message ?? typeErrorMessage('FormData', value));

View on GitHub ↗ (pinned to 7821031c66)

Solutions

  1. Trace the NaN/Infinity to its source — usually a failed parse or division by zero — and validate inputs there
  2. Convert numeric strings explicitly with `Number(value)` and check the parse succeeded before asserting
  3. Guard divisions: check the divisor is non-zero before computing
  4. If Infinity is a legitimate value in your domain, use `assert.number(value)` instead

Example fix

// before
const rate = Number(input);
assert.finiteNumber(rate); // throws if input was 'abc'
// after
const rate = Number(input);
if (Number.isNaN(rate)) throw new Error(`Invalid rate input: ${input}`);
assert.finiteNumber(rate);
Defensive patterns

Strategy: validation

Validate before calling

if (Number.isFinite(value)) {
  assert.finiteNumber(value);
}

Type guard

function isFiniteNumber(value: unknown): value is number {
  return typeof value === 'number' && Number.isFinite(value);
}

Try / catch

try {
  assert.finiteNumber(value);
} catch (error) {
  if (error instanceof TypeError) {
    // NaN, Infinity, -Infinity, or a non-number — often from division by zero or failed parse
  } else throw error;
}

Prevention

When it happens

Trigger: Calling `assert.finiteNumber(value)` with `NaN` (e.g. from `parseInt('abc')` or `0/0`), `Infinity` (from division by zero or overflow), a numeric string like `'42'`, null, or undefined.

Common situations: Parsing user/config input with `parseFloat`/`Number()` and getting NaN from malformed strings; division by zero in metrics or ratio calculations; JSON payloads carrying numbers as strings; missing object properties yielding undefined in arithmetic.

Related errors


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