import { Subscriber, Observable, Operator, TeardownLogic } from 'rxjs'; class FinalizeWithLastSubscriber extends Subscriber { /** * @param destination * @param callback * @param value default value */ constructor(destination: Subscriber, private readonly callback: (value: T) => void, private value: T) { super(destination); } _next(value: T) { this.value = value; this.destination.next?.(value); } _complete() { try { const { callback } = this; callback(this.value); } catch (error) { this.destination.error?.(error); } this.destination.complete?.(); } } class FinalizeWithLastOperator implements Operator { constructor(private readonly callback: (value: T) => void, private readonly defaultValue: T) {} call(subscriber: Subscriber, source: Observable): TeardownLogic { return source.subscribe(new FinalizeWithLastSubscriber(subscriber, this.callback, this.defaultValue)); } } export function finalizeWithLast(callback: (value: T) => void, defaultValue: T) { return function finalizeWithLastOperatorFunction(source: Observable): Observable { return source.lift(new FinalizeWithLastOperator(callback, defaultValue)); }; }