ReactiveX/rxjs

ObservableInput<T> should support Thennable<T>, not PromiseLike<T>

benlesh opened this issue · 1 comments

The type on ObservableInput is probably too strict.

We'll want to support Thennable<T> instead, as that's all that is required to convert with from et al.

interface Thennable<T> {
  then(onresolved?: ((value: T) => void) | null | undefined, onrejected?: ((reason: any) => void) | null | undefined): void;
}

The upside is we can then support more. The downside is if we decide we need to rely on the returned value of the then function, It'll require a breaking change.

Implementor note: We probably don't want to publicly expose Thennable, I'm sure a lot of folks already have that implemented in their codebase. It's been a mistake that we export * from types, honestly.

// Define the Thennable interface
interface Thennable {
then(onresolved?: ((value: T) => void) | null | undefined, onrejected?: ((reason: any) => void) | null | undefined): void;
}

// Function that takes an ObservableInput
function processObservable(observable: Thennable) {
// Simulate processing the observable
observable.then(
(value) => {
console.log("Resolved:", value);
},
(reason) => {
console.error("Rejected:", reason);
}
);
}

// Example usage
const myObservable: Thennable = {
then: (onresolved, onrejected) => {
// Simulate resolving the observable after a delay
setTimeout(() => {
if (Math.random() < 0.5) {
onresolved?.("Success");
} else {
onrejected?.("Failure");
}
}, 1000);
},
};

// Process the observable
processObservable(myObservable);