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

  1. Verify the raw value matches an enum VALUE, not a key — for `enum Color {Red = 'red'}` pass `'red'`, not `'Red'`
  2. Check for casing/format mismatches between the external source (API, env var) and the enum definition
  3. After enum changes, migrate persisted/serialized data that still contains removed values
  4. 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

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


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