Range Over Channels in TypeScript

Our first example demonstrates how to iterate over values received from a channel in TypeScript. While TypeScript doesn’t have built-in channels like Go, we can simulate this behavior using async generators.

async function* createQueue(): AsyncGenerator<string, void, unknown> {
    yield "one";
    yield "two";
}

async function main() {
    const queue = createQueue();

    // This for...of loop iterates over each element as it's
    // received from the queue. The iteration terminates after
    // receiving all elements (in this case, 2 elements).
    for await (const elem of queue) {
        console.log(elem);
    }
}

main().catch(console.error);

To run the program:

$ ts-node range-over-channels.ts
one
two

In this TypeScript example, we use an async generator function createQueue() to simulate a channel. The for await...of loop is used to iterate over the values yielded by the generator, which is analogous to ranging over a channel in Go.

While TypeScript doesn’t have the concept of closing channels, the async generator will automatically end when there are no more values to yield, achieving a similar effect to closing a channel in Go.

This example shows how we can use TypeScript’s async features to achieve behavior similar to Go’s channel iteration, demonstrating the language’s flexibility in handling asynchronous operations.