GitPedia

LinqToTypeScript

LINQ to TypeScript

From arogozine·Updated June 20, 2026·View on GitHub·

- **Implementation of [LINQ](https://en.wikipedia.org/wiki/Language_Integrated_Query) for TypeScript** - **Targets TypeScript 5.6.X and ES 2022** The project is written primarily in TypeScript, distributed under the MIT License license, first published in 2016. Key topics include: async, async-await, async-iteration, enumerable, es2019.

Latest release: 12.1.0LinqToTypeScript 12.1.0
April 16, 2026View Changelog →

LINQ To TypeScript

  • Implementation of LINQ for TypeScript
  • Targets TypeScript 5.6.X and ES 2022
TypeScript
await from([bing, google, quackQuackGo]) .asParallel() .selectAsync(downloadHtml) .select(getTitle) .toArray()

Getting Started

sh
npm i linq-to-typescript

npm
npm bundle size
License
npm

tsconfig.json

JSON
"compilerOptions": { "target": "es2022", "lib": [ "es2022" ] }
  • The strict TS option is recommended.

Node.js

Node.js 17 or higher is required.

Note: This package is ESM-only. If your project uses CommonJS (require), you'll need a bundler or interop shim.

Using the Library

With Wrappers

TypeScript
// 0. Import Module import { from } from "linq-to-typescript" // To Use With Wrappers const evenNumbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9]).where((x) => x % 2 === 0).toArray()

Without Wrappers

TypeScript
// 0. Import Module import { initializeLinq, IEnumerable } from "linq-to-typescript" // 1. Declare that the JS types implement the IEnumerable interface declare global { interface Array<T> extends IEnumerable<T> { } interface Uint8Array extends IEnumerable<number> { } interface Uint8ClampedArray extends IEnumerable<number> { } interface Uint16Array extends IEnumerable<number> { } interface Uint32Array extends IEnumerable<number> { } interface Int8Array extends IEnumerable<number> { } interface Int16Array extends IEnumerable<number> { } interface Int32Array extends IEnumerable<number> { } interface Float32Array extends IEnumerable<number> { } interface Float64Array extends IEnumerable<number> { } interface Map<K, V> extends IEnumerable<[K, V]> { } interface Set<T> extends IEnumerable<T> { } interface String extends IEnumerable<string> { } } // 2. Bind Linq Functions to Array, Map, etc initializeLinq() // 3. Use without a wrapper type const evenNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9].where((x) => x % 2 === 0).toArray()

Examples

The examples folder contains runnable demos:

  • primenumbers.ts — find primes using range().where().all()
  • digitsofpi.ts — approximate π via the Nilakantha series with range().select().aggregate()
  • paralleldownload.ts — download URLs in parallel with asParallel().selectAsync()

ES6 Modules (ESM)

To use library with ES6 modules make sure that you specify "type": "module" in package.json

API

TypeDoc API Surface Documentation

LinqToTypeScript implements the functionality of the IEnumerable interface

  • IEnumerable, IAsyncEnumerable, and IParallelEnumerable interfaces are based on,
  • IEnumerable<T> Interface
  • Some changes made due to conflicts with existing method names
  • Some changes made due to limitations of JavaScript

IEnumerable

  • Inspired by LINQ API Surface
  • Has Async methods that return Promise or IAsyncEnumerable
  • Implements Iterable<T>
  • Use from to wrap your arrays

IAsyncEnumerable

  • Inspired by LINQ API Surface
  • Has Async methods that return Promise or IAsyncEnumerable
  • For asynchronous iteration
  • Implements AsyncIterable<T> interface
  • Use fromAsync to wrap your AsyncIterable type

IParallelEnumerable

  • Inspired by LINQ API Surface
  • Has Async methods that return Promise or IParallelEnumerable
  • For asynchronous iteration in parallel (where possible)
  • Implements AsyncIterable<T> interface
  • Use fromParallel to create a parallel enumeration

Shared Instance Methods

MethodAsync*Tests CoverageNotes
aggregateNoSync
allYesSync, Async
anyYesSync, Async
appendNoSync
averageYesSync, Async
chunkNoSync
concatenateNoSyncEquivalent to .Concat but renamed to avoid conflict with JS
containsYesSync, Async
countYesSync, Async
defaultIfEmptyNoSync
distinctYesSync, Async
elementAtNoSync
elementAtOrDefaultNoSync
exceptYesSync, Async
firstYesSync, Async
firstOrDefaultYesSync, Async
eachYesSync, AsyncFrom List<T>.ForEach
groupByYesSync, Async
groupByWithSelNoSync
groupJoinYesSync, Async
intersectYesSync, Async
joinByKeyNoSync
lastYesSync, Async
lastOrDefaultYesSync, Async
maxYesSync, Async
maxByYesSync, Async
minYesSync, Async
minByYesSync, Async
ofTypeNoSync
orderNoSync
orderByYesSync, Async
orderByDescendingYesSync, Async
orderDescendingNoSync
partitionYesSync, Async
prependNoSync
reverseNoSync
selectYesSync, Async
selectManyYesSync, Async
sequenceEqualsYesSync, Async
singleYesSync, Async
singleOrDefaultYesSync, Async
skipNoSync
skipWhileYesSync, Async
sumYesSync, Async
takeNoSync
takeWhileYesSync, Async
toArrayNoSync
toMapYesSync, AsyncEquivalent to ToDictionary
toObjectYesSync, Async
toSetNoSyncEquivalent to ToHashSet. No comparer overload for JS.
unionYesSync
whereYesSync, Async
zipYesSync, Async

* Async methods take an async function

Static Methods

MethodDescriptionAsyncParallelTests Coverage
emptyReturns an empty enumerableemptyAsyncemptyParallelTest
enumerateObjectYields [key, value] pairs from a plain objectenumerateObjectAsyncN/ATest
flattenFlattens a nested iterable one level deepflattenAsyncflattenParallelTest
rangeGenerates a sequence of integers from start to start+countrangeAsyncrangeParallelTest
repeatRepeats a value N timesrepeatAsyncrepeatParallelTest

Index Methods

MethodNotes
bindArrayBinds IEnumerable methods to an ArrayLike Iterable type
bindLinqBinds IEnumerable methods to an Iterable type
bindLinqAsyncBinds IAsyncEnumerable methods to an AsyncIterable type
isEnumerableDetermines if source implements IEnumerable
isAsyncEnumerableDetermines if source implements IAsyncEnumerable
isParallelEnumerableDetermines if source implements IParallelEnumerable
initializeLinqBinds to IEnumerable to Array Types, Map, Set, & String

Exception Types

ExceptionNotes
ArgumentOutOfRangeExceptionThrown when a passed in argument is invalid
InvalidOperationExceptionThrown when no elements or no predicate match

Comparers

Built-in comparers can be passed to methods like distinct, contains, sequenceEquals, except, intersect, and union.

ExportPurpose
EqualityComparerLoose equality (==)
StrictEqualityComparerStrict equality (===)
NumberComparerNumeric ordering (for use with orderBy)
StringifyComparerEquality via JSON.stringify

Design

Binding new APIs to Array Types

JavaScript doesn't have extension methods like in C#, therefore we extend the class itself with new methods.
Call initializeLinq to bind library functions to default Array methods,

The following collections support IEnumerable,

  • Array
  • Map
  • Set
  • String
  • Int8Array
  • Int16Array
  • Int32Array
  • Uint8Array
  • Uint8ClampedArray
  • Uint16Array
  • Uint32Array
  • Float32Array
  • Float64Array

Using Wrappers

NOTE: Wrappers are safer as they won't interfere with other libraries.

TypeScript
// To Create an IEnumerable<T> import { from } from "linq-to-typescript" from(iterableIteratorOrArray) // To Create an IAsyncEnumerable<T> import { fromAsync } from "linq-to-typescript" fromAsync(asyncIterableIteratorOrPromiseArray) // To Create an IParallelEnumerable<T> // You have to specify the parallel generator function type import { fromParallel, ParallelGeneratorType } from "linq-to-typescript" fromParallel(ParallelGeneratorType.PromiseToArray, asyncFuncThatReturnsAnArray)

Issues and Questions

Q1: How does this compare to other LINQ libraries?

Other libraries tend to use eager evaluation and work with arrays instead of iterables.

Q2: Can I use your code?

With attribution; the code is licensed under MIT.

Q3: Why should I use this instead of lodash or something similar?

The whole library is written in TypeScript first and avoids typechecking done by TypeScript Language Service.

Lazy evaluation. Not much happens until you iterate over the enumerable or conver it to an Array, Map, etc.

Q4: Is IE11 supported?

No.

Q5: Can I contribute?

Please do!

Contributors

Showing top 3 contributors by commit count.

View all contributors on GitHub →

This article is auto-generated from arogozine/LinqToTypeScript via the GitHub API.Last fetched: 6/21/2026