Skip to content

Instantly share code, notes, and snippets.

@mwmcode
Forked from SgtPooki/vanilla-observable.ts
Created January 16, 2024 15:36
Show Gist options
  • Save mwmcode/608ae6023fa3d4a6ccd58f1d65125a24 to your computer and use it in GitHub Desktop.
Save mwmcode/608ae6023fa3d4a6ccd58f1d65125a24 to your computer and use it in GitHub Desktop.
Typescript version of a simple Observable. This was copied from https://stackoverflow.com/a/62002044/592760, translated to TypeScript, and improved.
/**
* Modified by Russell Dempsey on 2021 DEC 15
* @see https://stackoverflow.com/a/62002044/592760
*/
type Subscriber<T> = (value: T) => void;
class Observable<T> {
private subscribers = new Set<Subscriber<T>>();
constructor(private value: T) {}
get(): T {
return this.value;
}
set(newValue: T): void {
if (this.value === newValue) return;
this.value = newValue;
this.subscribers.forEach((listener) => listener(this.value));
}
subscribe(subscriber: Subscriber<T>): () => void {
this.subscribers.add(subscriber);
return () => this.unsubscribe(subscriber); // will be used inside React.useEffect
}
unsubscribe(subscriber: Subscriber<T>): void {
this.subscribers.delete(subscriber);
}
}
export type { Subscriber };
export { Observable };
@mwmcode
Copy link
Author

mwmcode commented Jan 16, 2024

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment