{"id":"17cb291c454752b5","repo":"sindresorhus/is","slug":"expected-value-which-is-iterable-received-value","errorCode":null,"errorMessage":"Expected value which is `Iterable`, received value of type `${is(value)}`.","messagePattern":"Expected value which is `Iterable`, received value of type `(.+?)`\\.","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"source/index.ts","lineNumber":1701,"sourceCode":"\t\tthrow new TypeError(message ?? typeErrorMessage('Int32Array', value));\n\t}\n}\n\nexport function assertInt8Array(value: unknown, message?: string): asserts value is Int8Array {\n\tif (!isInt8Array(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('Int8Array', value));\n\t}\n}\n\nexport function assertInteger(value: unknown, message?: string): asserts value is number {\n\tif (!isInteger(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('integer', value));\n\t}\n}\n\nexport function assertIterable<T = unknown>(value: unknown, message?: string): asserts value is Iterable<T> {\n\tif (!isIterable(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('Iterable', value));\n\t}\n}\n\nexport function assertMap<Key = unknown, Value = unknown>(value: unknown, message?: string): asserts value is Map<Key, Value> {\n\tif (!isMap(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('Map', value));\n\t}\n}\n\nexport function assertNan(value: unknown, message?: string): asserts value is number {\n\tif (!isNan(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('NaN', value));\n\t}\n}\n\nexport function assertNativePromise<T = unknown>(value: unknown, message?: string): asserts value is Promise<T> {\n\tif (!isNativePromise(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('native Promise', value));","sourceCodeStart":1683,"sourceCodeEnd":1719,"githubUrl":"https://github.com/sindresorhus/is/blob/7821031c66cdeb7256a0feb2d506535f9e84fcaf/source/index.ts#L1683-L1719","documentation":"Thrown by `assertIterable()` (source/index.ts:1699) when the value has no callable `[Symbol.iterator]` method (`isIterable` checks `isFunction(value?.[Symbol.iterator])`). It protects code that is about to use `for...of`, spread, or `Array.from` on the value.","triggerScenarios":"Passing a plain object `{a: 1}` (objects are not iterable), null/undefined, a number, or an async-only iterable (has `Symbol.asyncIterator` but not `Symbol.iterator`) to `assertIterable()`.","commonSituations":"Treating a JSON object as if it were an array of entries; passing an async generator where a sync iterable is expected; APIs that return a single item instead of a collection depending on input; forgetting that array-like objects (e.g. `{length: 2, 0: 'a', 1: 'b'}`) are not iterable.","solutions":["If it's a plain object, iterate its entries explicitly: `Object.entries(obj)` (arrays of entries are iterable).","If it's an async iterable, use `assertAsyncIterable()` and `for await...of` instead.","Wrap single values in an array (`[value]`) when the producer may return either one item or many.","Convert array-likes with `Array.from(arrayLike)` before asserting."],"exampleFix":"// before\nconst config = {a: 1, b: 2};\nassertIterable(config); // throws — plain object\n// after\nconst entries = Object.entries(config);\nassertIterable(entries);","handlingStrategy":"type-guard","validationCode":"if (value == null || typeof value[Symbol.iterator] !== 'function') {\n  value = [value]; // or reject\n}","typeGuard":"const isIterable = (v: unknown): v is Iterable<unknown> => v != null && typeof (v as any)[Symbol.iterator] === 'function';","tryCatchPattern":null,"preventionTips":["Plain objects are NOT iterable — use Object.entries/values to get an iterable view","Async generators are AsyncIterable, not Iterable; check Symbol.asyncIterator separately","Strings are iterable, which is often surprising — decide explicitly whether a lone string should count"],"tags":["iterable","iteration","type-assertion"],"analyzedSha":"7821031c66cdeb7256a0feb2d506535f9e84fcaf","analyzedAt":"2026-07-31T18:34:06.268Z","schemaVersion":2}