import { isObservableArray, Observable, ObservableArray } from "knockout"; import { useEffect, useState } from "react"; export function useObservableState(observable: Observable): [T, (s: T) => void]; export function useObservableState(observable: ObservableArray): [T[], (s: T[]) => void]; export function useObservableState(observable: ObservableArray | Observable): [T | T[], (s: T | T[]) => void] { const [value, setValue] = useState(observable()); useEffect(() => { isObservableArray(observable) ? observable.subscribe((values) => setValue([...values])) : observable.subscribe(setValue); }, [observable]); return [value, observable]; }