make-iterable

A TypeScript library that converts objects, functions, and their prototypes into Array-like iterable entities. Supports ES Modules, CommonJS, and UMD.

View the Project on GitHub lopatnov/make-iterable

@lopatnov/make-iterable

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 downloads npm version License GitHub issues GitHub stars


Table of Contents


Installation

npm install @lopatnov/make-iterable

Browser (CDN):

<script src="//lopatnov.github.io/make-iterable/dist/make-iterable.umd.min.js"></script>

Usage

ES Modules

import makeIterable from "@lopatnov/make-iterable";

CommonJS

const makeIterable = require("@lopatnov/make-iterable");

Browser / UMD

<script src="make-iterable.umd.min.js"></script>
<script>
  // available as window.makeIterable
  var x = makeIterable({});
</script>

API

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.


Examples

Make an Object Iterable and Array-Like

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"

Make a Class Iterable via Prototype

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"
}

Make a Function Iterable

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]

Demo


Contributing

Contributions are welcome! Please read CONTRIBUTING.md before opening a pull request.


Built With


License

Apache-2.0 © 2019–2026 Oleksandr Lopatnov · LinkedIn