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

  1. Convert arrays to Sets before asserting: `new Set(array)`.
  2. If the value crossed a JSON boundary, reconstruct the Set on deserialization since JSON.stringify turns Sets into `{}`.
  3. 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

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


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