sindresorhus/is · error · TypeError
Expected value which is `Set`, received value of type `${is(
Error message
Expected value which is `Set`, received value of type `${is(value)}`. What it means
Thrown by `assert.set()` (assertSet at source/index.ts:1882) when the value is not a native `Set` instance per `isSet`. The library distinguishes Sets from other collections by object-type tagging, so arrays, plain objects, Maps, and WeakSets all fail. The message reports the actual type via `is(value)`.
Source
Thrown at source/index.ts:1884
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));
}
}
export function assertString(value: unknown, message?: string): asserts value is string {
if (!isString(value)) {
throw new TypeError(message ?? typeErrorMessage('string', value));
}
}
export function assertSymbol(value: unknown, message?: string): asserts value is symbol {
if (!isSymbol(value)) {
throw new TypeError(message ?? typeErrorMessage('symbol', value));View on GitHub ↗ (pinned to 7821031c66)
Solutions
- Convert arrays to Sets before asserting: `new Set(array)`.
- If the value crossed a JSON boundary, reconstruct the Set on deserialization since JSON.stringify turns Sets into `{}`.
- If arrays are also acceptable, check `is.set(value) || is.array(value)` instead of asserting.
Example fix
// before const tags = JSON.parse(payload).tags; // arrives as array assert.set(tags); // after const tags = new Set(JSON.parse(payload).tags); assert.set(tags);
Defensive patterns
Strategy: type-guard
Validate before calling
if (!(value instanceof Set)) {
throw new TypeError('Expected a Set');
} Type guard
function isSet(value: unknown): value is Set<unknown> {
return Object.prototype.toString.call(value) === '[object Set]';
} Try / catch
try {
assert.set(value);
} catch (error) {
if (error instanceof TypeError) {
// often an Array or plain object was passed — convert with new Set(iterable)
}
throw error;
} Prevention
- Arrays are the most common wrong input — wrap with new Set(array) at the boundary
- Remember JSON has no Set: deserialized data always needs explicit conversion
- Type the parameter as Set<T> rather than Iterable<T> if the API truly requires a Set
When it happens
Trigger: Calling `assert.set(value)` with an array (`['a','b']`), a Map, a WeakSet, an object used as a set (`{a: true}`), or serialized data — Sets do not survive `JSON.parse`, arriving as `{}` or arrays.
Common situations: Data round-tripped through JSON (structuredClone preserves Sets, JSON does not); API layers that convert Sets to arrays; confusing `Set` with `WeakSet` or an array with unique values.
Related errors
- Expected value which is `bigint`, received value of type `${
- Expected value which is `Class`, received value of type `${i
- Expected value which is `Date`, received value of type `${is
- Expected value which is `empty map`, received value of type
- Expected value which is `empty object`, received value of ty
AI-assisted analysis of sindresorhus/is@7821031c66 (2026-07-31).
Data as JSON: /data/errors/09d952fc403ea935.json.
Report an issue: GitHub ↗.