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
- Trace where the odd/fractional value originates — often a division or off-by-one; fix the producer rather than the check
- If halving is intended, use `Math.trunc`/`Math.floor` deliberately and assert afterward
- Validate parsed numeric input for NaN before this assertion
- 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
- Check Number.isInteger first — floats like 2.0 pass but 2.5 fails before parity even matters
- Values parsed from strings ('4') are not numbers; convert with Number() and validate before asserting
- Beware NaN and Infinity — they are numbers but not integers
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
- Expected value which is `finite number`, received value of t
- Expected value which is `Array`, received value of type `${i
- Expected value which is `array-like`, received value of type
- Expected value which is `BigUint64Array`, received value of
- Expected value which is `empty map`, received value of type
AI-assisted analysis of sindresorhus/is@7821031c66 (2026-07-31).
Data as JSON: /data/errors/75aa67b4a8d489a2.json.
Report an issue: GitHub ↗.