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)); }; }