A TypeScript library that converts objects, functions, and their prototypes into Array-like iterable entities. Supports ES Modules, CommonJS, and UMD.
A TypeScript library that converts objects, functions, and their prototypes into Array-like iterable entities. Apply it to a class prototype and every instance becomes iterable automatically.
npm install @lopatnov/make-iterable
Browser (CDN):
<script src="//lopatnov.github.io/make-iterable/dist/make-iterable.umd.min.js"></script>
import makeIterable from "@lopatnov/make-iterable";
const makeIterable = require("@lopatnov/make-iterable");
<script src="make-iterable.umd.min.js"></script>
<script>
// available as window.makeIterable
var x = makeIterable({});
</script>
function makeIterable<T>(value: T): T & Array<any>;
Converts value to an Array-like iterable object in place and returns it. The original object reference is preserved — value === makeIterable(value).
The function attaches all Array.prototype methods (push, pop, splice, slice, indexOf, map, filter, forEach, etc.) and implements Symbol.iterator, enabling for...of loops and the spread operator.
Throws Error when value is undefined, null, a boolean, a number, or a string.
const x = { hello: "world" };
const iterableX = makeIterable(x);
iterableX.push(10); // [10]
iterableX.push(20); // [10, 20]
iterableX.push(30); // [10, 20, 30]
iterableX.push(40); // [10, 20, 30, 40]
iterableX.pop(); // [10, 20, 30]
for (const index in x) {
console.log(`Index [${index}] = ${x[index]}`);
// "Index [0] = 10"
// "Index [1] = 20"
// "Index [2] = 30"
// "Index [hello] = world"
}
for (const value of x) {
console.log(value); // 10, 20, 30
}
console.log(x === iterableX); // true
console.log(iterableX.indexOf(30)); // 2
console.log([...iterableX]); // [10, 20, 30]
console.log(iterableX.hello); // "world"
class Simple {
constructor(public message: string) {}
}
makeIterable(Simple.prototype);
const z = new Simple("Length is not enumerable now") as Simple & any[];
z.push([1, 2], [3, 4], [5, 6]);
for (const index in z) {
console.log(`z[${index}]=${z[index]}`);
// "z[0]=1,2"
// "z[1]=3,4"
// "z[2]=5,6"
// "z[message]=Length is not enumerable now"
}
const fn = function () {};
const iterableFn = makeIterable(fn);
iterableFn.push(1, 2, 3, 4, 5);
console.log(iterableFn.indexOf(3)); // 2
console.log([...iterableFn]); // [1, 2, 3, 4, 5]
Contributions are welcome! Please read CONTRIBUTING.md before opening a pull request.
Apache-2.0 © 2019–2026 Oleksandr Lopatnov · LinkedIn