import { OperatorFunction, Observable, ObservedValueOf } from 'rxjs'; const noOp = (stream: Observable) => stream; type IsEqualTypes = L extends R ? (R extends L ? true : never) : never; type InputStreamValueType< T extends (...args: unknown[]) => OperatorFunction > = ObservedValueOf>[0]>; type OutputStreamValueType< T extends (...args: unknown[]) => OperatorFunction > = ObservedValueOf>>; type IdentityOp< T extends (...args: unknown[]) => OperatorFunction > = ( ..._args: Parameters ) => OperatorFunction, InputStreamValueType>; type ConditionalOperatorReturnType< Op extends (...args: unknown[]) => OperatorFunction > = IsEqualTypes< InputStreamValueType, OutputStreamValueType > extends true ? Op : Op | IdentityOp; export function conditionalOperator< Op extends (...args: unknown[]) => OperatorFunction >(condition: boolean, op: Op): ConditionalOperatorReturnType { if (condition) { return op as ConditionalOperatorReturnType; } else { return ((..._args: Parameters) => noOp) as ConditionalOperatorReturnType; } }