nanostores
Version:
A tiny (265 bytes) state manager for React/Preact/Vue/Svelte with many atomic tree-shakable stores
87 lines (79 loc) • 2.54 kB
TypeScript
import type { ReadableAtom } from '../atom/index.js'
import type { AnyStore, Store, StoreValue } from '../map/index.js'
import type { Task } from '../task/index.js'
export type StoreValues<Stores extends AnyStore[]> = {
[Index in keyof Stores]: StoreValue<Stores[Index]>
}
type A = ReadableAtom<number>
type B = ReadableAtom<string>
type C = (...values: StoreValues<[A, B]>) => void
interface Computed {
<Value, OriginStore extends Store>(
stores: OriginStore,
cb: (value: StoreValue<OriginStore>) => Task<Value>
): ReadableAtom<undefined | Value>
<Value, OriginStores extends AnyStore[]>(
stores: [...OriginStores],
cb: (...values: StoreValues<OriginStores>) => Task<Value>
): ReadableAtom<undefined | Value>
<Value, OriginStore extends Store>(
stores: OriginStore,
cb: (value: StoreValue<OriginStore>) => Value
): ReadableAtom<Value>
/**
* Create derived store, which use generates value from another stores.
*
* ```js
* import { computed } from 'nanostores'
*
* import { $users } from './users.js'
*
* export const $admins = computed($users, users => {
* return users.filter(user => user.isAdmin)
* })
* ```
*
* An async function can be evaluated by using {@link task}.
*
* ```js
* import { computed, task } from 'nanostores'
*
* import { $userId } from './users.js'
*
* export const $user = computed($userId, userId => task(async () => {
* const response = await fetch(`https://my-api/users/${userId}`)
* return response.json()
* }))
* ```
*/
<Value, OriginStores extends AnyStore[]>(
stores: [...OriginStores],
cb: (...values: StoreValues<OriginStores>) => Task<Value> | Value
): ReadableAtom<Value>
}
export const computed: Computed
interface Batched {
<Value, OriginStore extends Store>(
stores: OriginStore,
cb: (value: StoreValue<OriginStore>) => Task<Value> | Value
): ReadableAtom<Value>
/**
* Create derived store, which use generates value from another stores.
*
* ```js
* import { batched } from 'nanostores'
*
* const $sortBy = atom('id')
* const $category = atom('')
*
* export const $link = batched([$sortBy, $category], (sortBy, category) => {
* return `/api/entities?sortBy=${sortBy}&category=${category}`
* })
* ```
*/
<Value, OriginStores extends AnyStore[]>(
stores: [...OriginStores],
cb: (...values: StoreValues<OriginStores>) => Task<Value> | Value
): ReadableAtom<Value>
}
export const batched: Batched