Reactive Programming in TypeScript: RxJS Library

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Reactive Programming in TypeScript with RxJS



Reactive programming is a development paradigm focused on asynchronous data streams and the propagation of changes. In the TypeScript ecosystem, the key tool for implementing this paradigm is the RxJS library (Reactive Extensions for JavaScript). It provides a powerful set of tools for working with events, asynchronous requests, and any data streams, making code more predictable and easily maintainable.



RxJS is based on the Observer pattern and the concept of Observable (an observable stream). An Observable is a data source that can generate values over time. You can subscribe to it using an Observer, which reacts to three types of events: next (new value), error (error), and complete (stream completion).



Installing and Configuring RxJS in TypeScript



To get started, install RxJS via npm:



npm install rxjs


RxJS is fully compatible with TypeScript and has built-in typings. Here is a simple example of creating an Observable:



import { Observable } from 'rxjs';

const observable = new Observable<number>(subscriber => { subscriber.next(1); subscriber.next(2); subscriber.next(3); setTimeout(() => { subscriber.next(4); subscriber.complete(); }, 1000);});

observable.subscribe({ next: (value) => console.log('Received:', value), error: (err) => console.error('Error:', err), complete: () => console.log('Stream completed')});


Core Concepts of RxJS



To effectively use reactive programming, it is important to understand the key building blocks of RxJS:



  • Observable — a data source that can be synchronous or asynchronous.
  • Observer — an object with methods next, error, complete that reacts to Observable events.
  • Subscription — an object representing the execution of an Observable. It can be cancelled using the unsubscribe() method.
  • Operators — pure functions for transforming, filtering, and combining data streams.
  • Subject — a special type of Observable that is also an Observer. It allows multicasting (distributing) values to multiple subscribers.


Popular RxJS Operators



Operators are the heart of RxJS. They allow you to process data streams declaratively. Let's look at a few commonly used ones:



  • map — transforms each value of the stream according to a given function.
  • filter — only passes values that satisfy a condition.
  • mergeMap — projects each value onto an Observable and merges the results into one stream.
  • debounceTime — delays the emission of values by a specified time (useful for search inputs).
  • catchError — catches errors in the stream and returns a fallback Observable.


Example of using operators to handle clicks:



import { fromEvent } from 'rxjs';import { map, filter, debounceTime } from 'rxjs/operators';

const clicks = fromEvent(document, 'click');

clicks.pipe( debounceTime(300), map((event: MouseEvent) => ({ x: event.clientX, y: event.clientY })), filter(pos => pos.x > 100)).subscribe(pos => { console.log('Click with coordinates:', pos);});


Practical Example: Reactive Search Form



Let's consider a typical task — implementing a search with autocomplete. With RxJS, this is done elegantly and without nested callbacks:



import { fromEvent } f                    

Recommendations