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
- Wrap string patterns: `new RegExp(pattern)` before passing to the assertion.
- If your API legitimately accepts strings or RegExp, branch with `is.regExp(value)` instead of asserting.
- 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
- Convert user-supplied pattern strings with new RegExp(pattern) (in its own try/catch for syntax errors) before asserting
- Prefer is.regExp() for branching; reserve assert.regExp for invariants
- Cross-realm RegExp (from iframes/vm) passes toString-based checks but may fail instanceof — use the toString form
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
- Expected value which is `PropertyKey`, received value of typ
- Expected value which is `safe integer`, received value of ty
- Expected value which is `string`, received value of type `${
- Expected value which is `symbol`, received value of type `${
- Expected value which is `truthy`, received value of type `${
AI-assisted analysis of sindresorhus/is@7821031c66 (2026-07-31).
Data as JSON: /data/errors/5628a32c20be76c7.json.
Report an issue: GitHub ↗.