sindresorhus/is · error · TypeError

Expected value which is `RegExp`, received value of type `${

Error message

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

What it means

Thrown by `assert.regExp()` (assertRegExp at source/index.ts:1870) when the value is not a RegExp instance per `isRegExp` (getObjectType check for 'RegExp'). The library enforces that only real RegExp objects pass, not pattern strings. The interpolated `is(value)` shows what type was actually received.

Source

Thrown at source/index.ts:1872

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

export function assertPromise<T = unknown>(value: unknown, message?: string): asserts value is Promise<T> {
	if (!isPromise(value)) {
		throw new TypeError(message ?? typeErrorMessage('Promise', value));
	}
}

export function assertPropertyKey(value: unknown, message?: string): asserts value is PropertyKey {
	if (!isPropertyKey(value)) {
		throw new TypeError(message ?? typeErrorMessage('PropertyKey', value));
	}
}

export function assertRegExp(value: unknown, message?: string): asserts value is RegExp {
	if (!isRegExp(value)) {
		throw new TypeError(message ?? typeErrorMessage('RegExp', value));
	}
}

export function assertSafeInteger(value: unknown, message?: string): asserts value is number {
	if (!isSafeInteger(value)) {
		throw new TypeError(message ?? typeErrorMessage('safe integer', value));
	}
}

export function assertSet<T = unknown>(value: unknown, message?: string): asserts value is Set<T> {
	if (!isSet(value)) {
		throw new TypeError(message ?? typeErrorMessage('Set', value));
	}
}

export function assertSharedArrayBuffer(value: unknown, message?: string): asserts value is SharedArrayBuffer {
	if (!isSharedArrayBuffer(value)) {
		throw new TypeError(message ?? typeErrorMessage('SharedArrayBuffer', value));

View on GitHub ↗ (pinned to 7821031c66)

Solutions

  1. Wrap string patterns: `new RegExp(pattern)` before passing to the assertion.
  2. If your API legitimately accepts strings or RegExp, branch with `is.regExp(value)` instead of asserting.
  3. Check for accidental `undefined` from a missing config key and fail with a clearer message upstream.

Example fix

// before
const pattern = config.filter; // '^foo$' from JSON
assert.regExp(pattern);
// after
const pattern = new RegExp(config.filter);
assert.regExp(pattern);
Defensive patterns

Strategy: type-guard

Validate before calling

if (!(value instanceof RegExp)) {
  throw new TypeError('Expected a RegExp');
}

Type guard

function isRegExp(value: unknown): value is RegExp {
  return Object.prototype.toString.call(value) === '[object RegExp]';
}

Try / catch

try {
  assert.regExp(value);
} catch (error) {
  if (error instanceof TypeError) {
    // got a pattern string or other non-RegExp
  }
  throw error;
}

Prevention

When it happens

Trigger: Calling `assert.regExp(value)` with a pattern string like `'^foo$'`, a plain object, or `undefined` instead of a `RegExp` instance created via `/.../` literal or `new RegExp()`.

Common situations: Reading a regex pattern from JSON or environment config, where it arrives as a string; APIs that accept `string | RegExp` but assert only RegExp; regexes passed across realms (iframes/vm) are still detected correctly since the check uses object-type tagging, so cross-realm is rarely the cause.

Related errors


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