sindresorhus/is · error · TypeError

Expected value which is `even integer`, received value of ty

Error message

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

What it means

Thrown by `assertEvenInteger` (source/index.ts:1602) when the number is not an even integer. The parameter is already typed `number`, so this is a runtime value check: the value must satisfy `Number.isInteger` and be divisible by 2. Odd integers, floats, NaN, and Infinity all fail.

Source

Thrown at source/index.ts:1604

		throw new TypeError(message ?? typeErrorMessage('empty string or whitespace', value));
	}
}

export function assertEnumCase<T = unknown>(value: unknown, targetEnum: T, message?: string): asserts value is T[keyof T] {
	if (!isEnumCase(value, targetEnum)) {
		throw new TypeError(message ?? typeErrorMessage('EnumCase', value));
	}
}

export function assertError(value: unknown, message?: string): asserts value is Error {
	if (!isError(value)) {
		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));

View on GitHub ↗ (pinned to 7821031c66)

Solutions

  1. Trace where the odd/fractional value originates — often a division or off-by-one; fix the producer rather than the check
  2. If halving is intended, use `Math.trunc`/`Math.floor` deliberately and assert afterward
  3. Validate parsed numeric input for NaN before this assertion
  4. If odd values are actually acceptable, use `assert.integer(n)` instead

Example fix

// before
assert.evenInteger(bytes.length / 3); // may be fractional/odd
// after
assert.evenInteger(bytes.length); // validate the raw length is even first
Defensive patterns

Strategy: validation

Validate before calling

if (Number.isInteger(value) && value % 2 === 0) {
  assert.evenInteger(value);
}

Type guard

function isEvenInteger(value: unknown): value is number {
  return typeof value === 'number' && Number.isInteger(value) && value % 2 === 0;
}

Try / catch

try {
  assert.evenInteger(value);
} catch (error) {
  if (error instanceof TypeError) {
    // not a number, not an integer, or odd — round or reject explicitly
  } else throw error;
}

Prevention

When it happens

Trigger: Calling `assert.evenInteger(n)` with an odd integer, a float like `2.5`, `NaN`, or `Infinity` — e.g. results of division that don't land on an even integer.

Common situations: Buffer/byte-pair length checks (UTF-16, stereo audio samples, hex strings) where an odd length indicates truncated data; grid/pagination math producing floats after division; `parseInt` on malformed input yielding NaN.

Related errors


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