UNPKG

@tanstack/store

Version:

Framework agnostic type-safe store w/ reactive framework adapters

48 lines (47 loc) 2.47 kB
import { Store } from './store.cjs'; import { Listener } from './types.cjs'; export type UnwrapDerivedOrStore<T> = T extends Derived<infer InnerD> ? InnerD : T extends Store<infer InnerS> ? InnerS : never; type UnwrapReadonlyDerivedOrStoreArray<TArr extends ReadonlyArray<Derived<any> | Store<any>>> = TArr extends readonly [infer Head, ...infer Tail] ? Head extends Derived<any> | Store<any> ? Tail extends ReadonlyArray<Derived<any> | Store<any>> ? [UnwrapDerivedOrStore<Head>, ...UnwrapReadonlyDerivedOrStoreArray<Tail>] : [] : [] : []; export interface DerivedFnProps<TArr extends ReadonlyArray<Derived<any> | Store<any>> = ReadonlyArray<any>, TUnwrappedArr extends UnwrapReadonlyDerivedOrStoreArray<TArr> = UnwrapReadonlyDerivedOrStoreArray<TArr>> { /** * `undefined` if it's the first run * @privateRemarks this also cannot be typed as TState, as it breaks the inferencing of the function's return type when an argument is used - even with `NoInfer` usage */ prevVal: unknown | undefined; prevDepVals: TUnwrappedArr | undefined; currDepVals: TUnwrappedArr; } export interface DerivedOptions<TState, TArr extends ReadonlyArray<Derived<any> | Store<any>> = ReadonlyArray<any>> { onSubscribe?: (listener: Listener<TState>, derived: Derived<TState>) => () => void; onUpdate?: () => void; deps: TArr; /** * Values of the `deps` from before and after the current invocation of `fn` */ fn: (props: DerivedFnProps<TArr>) => TState; } export declare class Derived<TState, const TArr extends ReadonlyArray<Derived<any> | Store<any>> = ReadonlyArray<any>> { listeners: Set<Listener<TState>>; state: TState; prevState: TState | undefined; options: DerivedOptions<TState, TArr>; /** * Functions representing the subscriptions. Call a function to cleanup * @private */ _subscriptions: Array<() => void>; lastSeenDepValues: Array<unknown>; getDepVals: () => { prevDepVals: unknown[]; currDepVals: unknown[]; prevVal: NonNullable<TState> | undefined; }; constructor(options: DerivedOptions<TState, TArr>); registerOnGraph(deps?: ReadonlyArray<Derived<any> | Store<any>>): void; unregisterFromGraph(deps?: ReadonlyArray<Derived<any> | Store<any>>): void; recompute: () => void; checkIfRecalculationNeededDeeply: () => void; mount: () => () => void; subscribe: (listener: Listener<TState>) => () => void; } export {};