sindresorhus/is · error · TypeError
Expected value which is `EnumCase`, received value of type `
Error message
Expected value which is `EnumCase`, received value of type `${is(value)}`. What it means
Thrown by `assertEnumCase` (source/index.ts:1590) when the value is not one of the values of the supplied enum object. `isEnumCase` checks membership against `Object.values(targetEnum)`, so the assertion validates that an untrusted value maps to an actual enum case before it's used as `T[keyof T]`.
Source
Thrown at source/index.ts:1592
throw new TypeError(message ?? typeErrorMessage('empty set', value));
}
}
export function assertEmptyString(value: unknown, message?: string): asserts value is '' {
if (!isEmptyString(value)) {
throw new TypeError(message ?? typeErrorMessage('empty string', value));
}
}
export function assertEmptyStringOrWhitespace(value: unknown, message?: string): asserts value is '' | Whitespace {
if (!isEmptyStringOrWhitespace(value)) {
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));View on GitHub ↗ (pinned to 7821031c66)
Solutions
- Verify the raw value matches an enum VALUE, not a key — for `enum Color {Red = 'red'}` pass `'red'`, not `'Red'`
- Check for casing/format mismatches between the external source (API, env var) and the enum definition
- After enum changes, migrate persisted/serialized data that still contains removed values
- Use `is.enumCase(value, MyEnum)` to branch and supply a default instead of throwing
Example fix
// before
assert.enumCase('Red', Color); // key name, throws
// after
assert.enumCase('red', Color); // matches Color.Red = 'red' Defensive patterns
Strategy: validation
Validate before calling
const ALLOWED = Object.values(MyEnum);
if (ALLOWED.includes(value)) {
assert.enumCase(value, MyEnum);
} Type guard
function isEnumCase<T extends Record<string, unknown>>(value: unknown, targetEnum: T): value is T[keyof T] {
return Object.values(targetEnum).includes(value);
} Try / catch
try {
assert.enumCase(value, MyEnum);
} catch (error) {
if (error instanceof TypeError) {
// value is not one of the enum's values — often stale data or an unmapped API string
} else throw error;
} Prevention
- Validate external/API strings against Object.values(Enum) at the trust boundary before asserting
- Remember numeric TypeScript enums have reverse mappings — Object.values includes both keys and numbers, which can cause surprises
- Centralize enum parsing in one function so new cases are handled in a single place
When it happens
Trigger: Calling `assert.enumCase(value, MyEnum)` where `value` is not among `Object.values(MyEnum)` — e.g. passing an enum key name instead of its value, a raw string with wrong casing, or a stale value after the enum was changed.
Common situations: Parsing enum values from query strings, JSON payloads, or environment variables; numeric TypeScript enums where reverse-mapping keys pollute `Object.values` expectations; an enum member being renamed or removed in a version upgrade while persisted data still holds the old value.
Related errors
- Expected value which is `empty map`, received value of type
- Expected value which is `empty object`, received value of ty
- Expected value which is `empty set`, received value of type
- Expected value which is `empty string`, received value of ty
- Expected value which is `empty string or whitespace`, receiv
AI-assisted analysis of sindresorhus/is@7821031c66 (2026-07-31).
Data as JSON: /data/errors/cec93a71210c7ac3.json.
Report an issue: GitHub ↗.