solid-js 2.0.0-experimental.6 → 2.0.0-experimental.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dev.cjs CHANGED
@@ -53,6 +53,27 @@ function registerGraph(value) {
53
53
  value.graph = owner;
54
54
  }
55
55
 
56
+ function tryCatch(fn) {
57
+ try {
58
+ const v = fn();
59
+ if (v instanceof Promise) {
60
+ return v.then(v => [undefined, v], e => {
61
+ if (e instanceof signals.NotReadyError) throw e;
62
+ return [e];
63
+ });
64
+ }
65
+ return [undefined, v];
66
+ } catch (e) {
67
+ if (e instanceof signals.NotReadyError) throw e;
68
+ return [e];
69
+ }
70
+ }
71
+ function reducer(source, reducerFn) {
72
+ return [source[0], action => {
73
+ source[1](s => reducerFn(s, action));
74
+ }];
75
+ }
76
+
56
77
  function observable(input) {
57
78
  return {
58
79
  subscribe(observer) {
@@ -343,6 +364,14 @@ Object.defineProperty(exports, "createMemo", {
343
364
  enumerable: true,
344
365
  get: function () { return signals.createMemo; }
345
366
  });
367
+ Object.defineProperty(exports, "createOptimistic", {
368
+ enumerable: true,
369
+ get: function () { return signals.createOptimistic; }
370
+ });
371
+ Object.defineProperty(exports, "createOptimisticStore", {
372
+ enumerable: true,
373
+ get: function () { return signals.createOptimisticStore; }
374
+ });
346
375
  Object.defineProperty(exports, "createProjection", {
347
376
  enumerable: true,
348
377
  get: function () { return signals.createProjection; }
@@ -439,9 +468,9 @@ Object.defineProperty(exports, "snapshot", {
439
468
  enumerable: true,
440
469
  get: function () { return signals.snapshot; }
441
470
  });
442
- Object.defineProperty(exports, "tryCatch", {
471
+ Object.defineProperty(exports, "transition", {
443
472
  enumerable: true,
444
- get: function () { return signals.tryCatch; }
473
+ get: function () { return signals.transition; }
445
474
  });
446
475
  Object.defineProperty(exports, "untrack", {
447
476
  enumerable: true,
@@ -467,7 +496,9 @@ exports.from = from;
467
496
  exports.lazy = lazy;
468
497
  exports.observable = observable;
469
498
  exports.onMount = onMount;
499
+ exports.reducer = reducer;
470
500
  exports.sharedConfig = sharedConfig;
471
501
  exports.ssrHandleError = ssrHandleError;
472
502
  exports.ssrRunInScope = ssrRunInScope;
503
+ exports.tryCatch = tryCatch;
473
504
  exports.useContext = useContext;
package/dist/dev.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createEffect, getContext, createMemo, flatten, createRoot, setContext, getOwner, untrack, onCleanup, createSignal, createSuspense, flush, runWithObserver, createAsync as createAsync$1, mapArray, repeat, createErrorBoundary, createBoundary } from '@solidjs/signals';
2
- export { $PROXY, $TRACK, createEffect, createMemo, createProjection, createRenderEffect, createRoot, createSignal, createStore, deep, flatten, flush, getObserver, getOwner, isEqual, isPending, isWrappable, latest, mapArray, merge, omit, onCleanup, reconcile, repeat, resolve, runWithObserver, runWithOwner, snapshot, tryCatch, untrack } from '@solidjs/signals';
1
+ import { createEffect, getContext, createMemo, flatten, createRoot, setContext, getOwner, untrack, NotReadyError, onCleanup, createSignal, createSuspense, flush, runWithObserver, createAsync as createAsync$1, mapArray, repeat, createErrorBoundary, createBoundary } from '@solidjs/signals';
2
+ export { $PROXY, $TRACK, createEffect, createMemo, createOptimistic, createOptimisticStore, createProjection, createRenderEffect, createRoot, createSignal, createStore, deep, flatten, flush, getObserver, getOwner, isEqual, isPending, isWrappable, latest, mapArray, merge, omit, onCleanup, reconcile, repeat, resolve, runWithObserver, runWithOwner, snapshot, transition, untrack } from '@solidjs/signals';
3
3
 
4
4
  const $DEVCOMP = Symbol("COMPONENT_DEV" );
5
5
  function onMount(fn) {
@@ -52,6 +52,27 @@ function registerGraph(value) {
52
52
  value.graph = owner;
53
53
  }
54
54
 
55
+ function tryCatch(fn) {
56
+ try {
57
+ const v = fn();
58
+ if (v instanceof Promise) {
59
+ return v.then(v => [undefined, v], e => {
60
+ if (e instanceof NotReadyError) throw e;
61
+ return [e];
62
+ });
63
+ }
64
+ return [undefined, v];
65
+ } catch (e) {
66
+ if (e instanceof NotReadyError) throw e;
67
+ return [e];
68
+ }
69
+ }
70
+ function reducer(source, reducerFn) {
71
+ return [source[0], action => {
72
+ source[1](s => reducerFn(s, action));
73
+ }];
74
+ }
75
+
55
76
  function observable(input) {
56
77
  return {
57
78
  subscribe(observer) {
@@ -326,4 +347,4 @@ if (globalThis) {
326
347
  if (!globalThis.Solid$$) globalThis.Solid$$ = true;else console.warn("You appear to have multiple instances of Solid. This can lead to unexpected behavior.");
327
348
  }
328
349
 
329
- export { $DEVCOMP, Boundary, DEV, ErrorBoundary, For, Match, Repeat, Show, Suspense, Switch, children, createAsync, createComponent, createContext, createUniqueId, enableHydration, from, lazy, observable, onMount, sharedConfig, ssrHandleError, ssrRunInScope, useContext };
350
+ export { $DEVCOMP, Boundary, DEV, ErrorBoundary, For, Match, Repeat, Show, Suspense, Switch, children, createAsync, createComponent, createContext, createUniqueId, enableHydration, from, lazy, observable, onMount, reducer, sharedConfig, ssrHandleError, ssrRunInScope, tryCatch, useContext };
package/dist/server.cjs CHANGED
@@ -320,6 +320,7 @@ function createAsync(compute, value, options) {
320
320
  return value;
321
321
  });
322
322
  }
323
+ const createOptimistic = createSignal;
323
324
  function isPending(fn, fallback) {
324
325
  try {
325
326
  fn();
@@ -409,6 +410,7 @@ function createProjection(fn, initialValue = {}) {
409
410
  fn(state);
410
411
  return state;
411
412
  }
413
+ const createOptimisticStore = createStore;
412
414
  function reconcile(value) {
413
415
  return state => {
414
416
  if (!isWrappable(state) || !isWrappable(value)) return value;
@@ -463,6 +465,15 @@ function omit(props, ...keys) {
463
465
  }
464
466
  return clone;
465
467
  }
468
+ function deep(store) {
469
+ return store;
470
+ }
471
+
472
+ function reducer(source, reducerFn) {
473
+ return [source[0], action => {
474
+ source[1](s => reducerFn(s, action));
475
+ }];
476
+ }
466
477
 
467
478
  const $DEVCOMP = Symbol("solid-dev-component");
468
479
  const DEV = undefined;
@@ -503,6 +514,10 @@ Object.defineProperty(exports, "runWithOwner", {
503
514
  enumerable: true,
504
515
  get: function () { return signals.runWithOwner; }
505
516
  });
517
+ Object.defineProperty(exports, "transition", {
518
+ enumerable: true,
519
+ get: function () { return signals.transition; }
520
+ });
506
521
  Object.defineProperty(exports, "tryCatch", {
507
522
  enumerable: true,
508
523
  get: function () { return signals.tryCatch; }
@@ -522,11 +537,14 @@ exports.createComponent = createComponent;
522
537
  exports.createContext = createContext;
523
538
  exports.createEffect = createEffect;
524
539
  exports.createMemo = createMemo;
540
+ exports.createOptimistic = createOptimistic;
541
+ exports.createOptimisticStore = createOptimisticStore;
525
542
  exports.createProjection = createProjection;
526
543
  exports.createRenderEffect = createRenderEffect;
527
544
  exports.createSignal = createSignal;
528
545
  exports.createStore = createStore;
529
546
  exports.createUniqueId = createUniqueId;
547
+ exports.deep = deep;
530
548
  exports.enableHydration = enableHydration;
531
549
  exports.flush = flush;
532
550
  exports.from = from;
@@ -540,6 +558,7 @@ exports.observable = observable;
540
558
  exports.omit = omit;
541
559
  exports.onMount = onMount;
542
560
  exports.reconcile = reconcile;
561
+ exports.reducer = reducer;
543
562
  exports.repeat = repeat;
544
563
  exports.resolve = resolve;
545
564
  exports.runWithObserver = runWithObserver;
package/dist/server.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { getContext, onCleanup, Owner, runWithOwner, createRoot, setContext, flatten, NotReadyError, getOwner } from '@solidjs/signals';
2
- export { $PROXY, $TRACK, createRoot, flatten, getOwner, isEqual, isWrappable, onCleanup, runWithOwner, tryCatch } from '@solidjs/signals';
2
+ export { $PROXY, $TRACK, createRoot, flatten, getOwner, isEqual, isWrappable, onCleanup, runWithOwner, transition, tryCatch } from '@solidjs/signals';
3
3
 
4
4
  function onMount(fn) {
5
5
  createEffect();
@@ -319,6 +319,7 @@ function createAsync(compute, value, options) {
319
319
  return value;
320
320
  });
321
321
  }
322
+ const createOptimistic = createSignal;
322
323
  function isPending(fn, fallback) {
323
324
  try {
324
325
  fn();
@@ -408,6 +409,7 @@ function createProjection(fn, initialValue = {}) {
408
409
  fn(state);
409
410
  return state;
410
411
  }
412
+ const createOptimisticStore = createStore;
411
413
  function reconcile(value) {
412
414
  return state => {
413
415
  if (!isWrappable(state) || !isWrappable(value)) return value;
@@ -462,8 +464,17 @@ function omit(props, ...keys) {
462
464
  }
463
465
  return clone;
464
466
  }
467
+ function deep(store) {
468
+ return store;
469
+ }
470
+
471
+ function reducer(source, reducerFn) {
472
+ return [source[0], action => {
473
+ source[1](s => reducerFn(s, action));
474
+ }];
475
+ }
465
476
 
466
477
  const $DEVCOMP = Symbol("solid-dev-component");
467
478
  const DEV = undefined;
468
479
 
469
- export { $DEVCOMP, DEV, ErrorBoundary, For, Match, Repeat, Show, Suspense, Switch, children, createAsync, createComponent, createContext, createEffect, createMemo, createProjection, createRenderEffect, createSignal, createStore, createUniqueId, enableHydration, flush, from, getObserver, isPending, latest, lazy, mapArray, merge, observable, omit, onMount, reconcile, repeat, resolve, runWithObserver, sharedConfig, ssrHandleError, ssrRunInScope, untrack, unwrap, useContext };
480
+ export { $DEVCOMP, DEV, ErrorBoundary, For, Match, Repeat, Show, Suspense, Switch, children, createAsync, createComponent, createContext, createEffect, createMemo, createOptimistic, createOptimisticStore, createProjection, createRenderEffect, createSignal, createStore, createUniqueId, deep, enableHydration, flush, from, getObserver, isPending, latest, lazy, mapArray, merge, observable, omit, onMount, reconcile, reducer, repeat, resolve, runWithObserver, sharedConfig, ssrHandleError, ssrRunInScope, untrack, unwrap, useContext };
package/dist/solid.cjs CHANGED
@@ -31,6 +31,27 @@ function children(fn) {
31
31
  return memo;
32
32
  }
33
33
 
34
+ function tryCatch(fn) {
35
+ try {
36
+ const v = fn();
37
+ if (v instanceof Promise) {
38
+ return v.then(v => [undefined, v], e => {
39
+ if (e instanceof signals.NotReadyError) throw e;
40
+ return [e];
41
+ });
42
+ }
43
+ return [undefined, v];
44
+ } catch (e) {
45
+ if (e instanceof signals.NotReadyError) throw e;
46
+ return [e];
47
+ }
48
+ }
49
+ function reducer(source, reducerFn) {
50
+ return [source[0], action => {
51
+ source[1](s => reducerFn(s, action));
52
+ }];
53
+ }
54
+
34
55
  function observable(input) {
35
56
  return {
36
57
  subscribe(observer) {
@@ -296,6 +317,14 @@ Object.defineProperty(exports, "createMemo", {
296
317
  enumerable: true,
297
318
  get: function () { return signals.createMemo; }
298
319
  });
320
+ Object.defineProperty(exports, "createOptimistic", {
321
+ enumerable: true,
322
+ get: function () { return signals.createOptimistic; }
323
+ });
324
+ Object.defineProperty(exports, "createOptimisticStore", {
325
+ enumerable: true,
326
+ get: function () { return signals.createOptimisticStore; }
327
+ });
299
328
  Object.defineProperty(exports, "createProjection", {
300
329
  enumerable: true,
301
330
  get: function () { return signals.createProjection; }
@@ -392,9 +421,9 @@ Object.defineProperty(exports, "snapshot", {
392
421
  enumerable: true,
393
422
  get: function () { return signals.snapshot; }
394
423
  });
395
- Object.defineProperty(exports, "tryCatch", {
424
+ Object.defineProperty(exports, "transition", {
396
425
  enumerable: true,
397
- get: function () { return signals.tryCatch; }
426
+ get: function () { return signals.transition; }
398
427
  });
399
428
  Object.defineProperty(exports, "untrack", {
400
429
  enumerable: true,
@@ -420,7 +449,9 @@ exports.from = from;
420
449
  exports.lazy = lazy;
421
450
  exports.observable = observable;
422
451
  exports.onMount = onMount;
452
+ exports.reducer = reducer;
423
453
  exports.sharedConfig = sharedConfig;
424
454
  exports.ssrHandleError = ssrHandleError;
425
455
  exports.ssrRunInScope = ssrRunInScope;
456
+ exports.tryCatch = tryCatch;
426
457
  exports.useContext = useContext;
package/dist/solid.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createEffect, getContext, createMemo, flatten, createRoot, setContext, getOwner, onCleanup, createSignal, createSuspense, flush, runWithObserver, createAsync as createAsync$1, untrack, mapArray, repeat, createErrorBoundary, createBoundary } from '@solidjs/signals';
2
- export { $PROXY, $TRACK, createEffect, createMemo, createProjection, createRenderEffect, createRoot, createSignal, createStore, deep, flatten, flush, getObserver, getOwner, isEqual, isPending, isWrappable, latest, mapArray, merge, omit, onCleanup, reconcile, repeat, resolve, runWithObserver, runWithOwner, snapshot, tryCatch, untrack } from '@solidjs/signals';
1
+ import { createEffect, getContext, createMemo, flatten, createRoot, setContext, NotReadyError, getOwner, onCleanup, createSignal, createSuspense, flush, runWithObserver, createAsync as createAsync$1, untrack, mapArray, repeat, createErrorBoundary, createBoundary } from '@solidjs/signals';
2
+ export { $PROXY, $TRACK, createEffect, createMemo, createOptimistic, createOptimisticStore, createProjection, createRenderEffect, createRoot, createSignal, createStore, deep, flatten, flush, getObserver, getOwner, isEqual, isPending, isWrappable, latest, mapArray, merge, omit, onCleanup, reconcile, repeat, resolve, runWithObserver, runWithOwner, snapshot, transition, untrack } from '@solidjs/signals';
3
3
 
4
4
  const $DEVCOMP = Symbol(0);
5
5
  function onMount(fn) {
@@ -30,6 +30,27 @@ function children(fn) {
30
30
  return memo;
31
31
  }
32
32
 
33
+ function tryCatch(fn) {
34
+ try {
35
+ const v = fn();
36
+ if (v instanceof Promise) {
37
+ return v.then(v => [undefined, v], e => {
38
+ if (e instanceof NotReadyError) throw e;
39
+ return [e];
40
+ });
41
+ }
42
+ return [undefined, v];
43
+ } catch (e) {
44
+ if (e instanceof NotReadyError) throw e;
45
+ return [e];
46
+ }
47
+ }
48
+ function reducer(source, reducerFn) {
49
+ return [source[0], action => {
50
+ source[1](s => reducerFn(s, action));
51
+ }];
52
+ }
53
+
33
54
  function observable(input) {
34
55
  return {
35
56
  subscribe(observer) {
@@ -279,4 +300,4 @@ function ssrHandleError() {}
279
300
  function ssrRunInScope() {}
280
301
  const DEV = undefined;
281
302
 
282
- export { $DEVCOMP, Boundary, DEV, ErrorBoundary, For, Match, Repeat, Show, Suspense, Switch, children, createAsync, createComponent, createContext, createUniqueId, enableHydration, from, lazy, observable, onMount, sharedConfig, ssrHandleError, ssrRunInScope, useContext };
303
+ export { $DEVCOMP, Boundary, DEV, ErrorBoundary, For, Match, Repeat, Show, Suspense, Switch, children, createAsync, createComponent, createContext, createUniqueId, enableHydration, from, lazy, observable, onMount, reducer, sharedConfig, ssrHandleError, ssrRunInScope, tryCatch, useContext };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "solid-js",
3
3
  "description": "A declarative JavaScript library for building user interfaces.",
4
- "version": "2.0.0-experimental.6",
4
+ "version": "2.0.0-experimental.8",
5
5
  "author": "Ryan Carniato",
6
6
  "license": "MIT",
7
7
  "homepage": "https://solidjs.com",
@@ -79,7 +79,7 @@
79
79
  "performance"
80
80
  ],
81
81
  "dependencies": {
82
- "@solidjs/signals": "^0.4.1",
82
+ "@solidjs/signals": "^0.5.0",
83
83
  "csstype": "^3.1.0",
84
84
  "seroval": "~1.3.0",
85
85
  "seroval-plugins": "~1.3.0"
package/types/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- export { $PROXY, $TRACK, createEffect, createMemo, createProjection, createRenderEffect, createRoot, createSignal, createStore, flatten, flush, getObserver, getOwner, isEqual, isPending, isWrappable, latest, mapArray, merge, omit, onCleanup, reconcile, repeat, resolve, runWithObserver, runWithOwner, snapshot, tryCatch, untrack, deep } from "@solidjs/signals";
1
+ export { $PROXY, $TRACK, createEffect, createMemo, createOptimistic, createOptimisticStore, createProjection, createRenderEffect, createRoot, createSignal, createStore, flatten, flush, getObserver, getOwner, isEqual, isPending, isWrappable, latest, mapArray, merge, omit, onCleanup, reconcile, repeat, resolve, runWithObserver, runWithOwner, snapshot, untrack, deep, transition } from "@solidjs/signals";
2
2
  export type { Accessor, BoundaryMode, ComputeFunction, EffectFunction, EffectOptions, Merge, NoInfer, NotWrappable, Omit, Owner, Signal, SignalOptions, Setter, Store, SolidStore, StoreNode, StoreSetter, TryCatchResult } from "@solidjs/signals";
3
3
  export { $DEVCOMP, children, createContext, onMount, useContext } from "./client/core.js";
4
4
  export type { ChildrenReturn, Context, ContextProviderComponent, ResolvedChildren, ResolvedJSXElement } from "./client/core.js";
5
+ export * from "./utilities.js";
5
6
  export * from "./client/observable.js";
6
7
  export * from "./client/component.js";
7
8
  export * from "./client/flow.js";
@@ -1,8 +1,9 @@
1
- export { $PROXY, $TRACK, tryCatch, flatten, isEqual, isWrappable } from "@solidjs/signals";
2
- export { createAsync, createEffect, createMemo, createRenderEffect, createRoot, createSignal, flush, getObserver, getOwner, isPending, latest, mapArray, onCleanup, repeat, resolve, runWithObserver, runWithOwner, untrack } from "./signals.js";
1
+ export { $PROXY, $TRACK, tryCatch, flatten, isEqual, isWrappable, transition } from "@solidjs/signals";
2
+ export { createAsync, createEffect, createMemo, createOptimistic, createRenderEffect, createRoot, createSignal, flush, getObserver, getOwner, isPending, latest, mapArray, onCleanup, repeat, resolve, runWithObserver, runWithOwner, untrack } from "./signals.js";
3
3
  export { observable, from, children, createContext, onMount, useContext, ssrRunInScope } from "./reactive.js";
4
- export { createProjection, createStore, unwrap, reconcile, merge, omit } from "./store.js";
4
+ export { createProjection, createStore, createOptimisticStore, unwrap, reconcile, merge, omit, deep } from "./store.js";
5
5
  export { createComponent, For, Repeat, Show, Switch, Match, ErrorBoundary, Suspense, enableHydration, createUniqueId, lazy, sharedConfig, ssrHandleError } from "./rendering.js";
6
+ export * from "../utilities.js";
6
7
  export declare const $DEVCOMP: unique symbol;
7
8
  export declare const DEV: undefined;
8
9
  export type { Component } from "../index.js";
@@ -21,6 +21,7 @@ export declare function createEffect<Next, Init = Next>(compute: ComputeFunction
21
21
  export declare function createAsync<T>(compute: (prev?: T) => Promise<T> | AsyncIterable<T> | T, value?: T, options?: MemoOptions<T> & {
22
22
  deferStream?: boolean;
23
23
  }): Accessor<T>;
24
+ export declare const createOptimistic: typeof createSignal;
24
25
  export declare function isPending(fn: () => any, fallback?: boolean): boolean;
25
26
  export declare function latest<T>(fn: () => T, fallback?: T): T | undefined;
26
27
  export declare function resolve(): void;
@@ -4,6 +4,8 @@ export declare function isWrappable(obj: any): boolean;
4
4
  export declare function unwrap<T>(item: T): T;
5
5
  export declare function createStore<T>(state: T | Store<T>): [get: Store<T>, set: StoreSetter<T>];
6
6
  export declare function createProjection<T extends Object>(fn: (draft: T) => void, initialValue?: T): Store<T>;
7
+ export declare const createOptimisticStore: typeof createStore;
7
8
  export declare function reconcile<T extends U, U extends object>(value: T): (state: U) => T;
8
9
  export declare function merge<T extends unknown[]>(...sources: T): Merge<T>;
9
10
  export declare function omit<T extends Record<any, any>, K extends readonly (keyof T)[]>(props: T, ...keys: K): Omit<T, K>;
11
+ export declare function deep<T extends object>(store: Store<T>): Store<T>;
@@ -0,0 +1,36 @@
1
+ import { Accessor, Signal, Store, StoreSetter } from "@solidjs/signals";
2
+ /**
3
+ * Runs the given function and returns a tuple with the result or an error.
4
+ * If the function throws an error, it will be caught and returned as the first element of the tuple.
5
+ * If the function returns a promise, it will resolve to a tuple with the result or an error.
6
+ *
7
+ * @param fn The function to run.
8
+ * @returns A tuple with either [undefined, result] or [error].
9
+ *
10
+ * @description https://docs.solidjs.com/reference/reactive-utilities/try-catch
11
+ */
12
+ export type TryCatchResult<T, E> = [undefined, T] | [E];
13
+ export declare function tryCatch<T, E = Error>(fn: () => Promise<T>): Promise<TryCatchResult<T, E>>;
14
+ export declare function tryCatch<T, E = Error>(fn: () => T): TryCatchResult<T, E>;
15
+ /**
16
+ * Simple reducer utility for Signals and Stores
17
+ * ```typescript
18
+ * const [state, dispatch] = reducer(createSignal({ count: 0 }), (state, action) => {
19
+ * switch (action.type) {
20
+ * case "increment":
21
+ * return { count: state.count + 1 };
22
+ * case "decrement":
23
+ * return { count: state.count - 1 };
24
+ * default:
25
+ * return state;
26
+ * }
27
+ * });
28
+ * ```
29
+ * @param source Signal or Store tuple
30
+ * @param reducerFn reducer function that receives the current value and an action, and returns the new value for signals or void for stores
31
+ * @returns a tuple with the current value accessor and a dispatch function to send actions to the reducer
32
+ *
33
+ * @description https://docs.solidjs.com/reference/reactive-utilities/reducer
34
+ */
35
+ export declare function reducer<T, A>(source: Signal<T>, reducerFn: (value: T, action: A) => T): [Accessor<T>, (action: A) => void];
36
+ export declare function reducer<T, A>(source: [Store<T>, StoreSetter<T>], reducerFn: (value: T, action: A) => T | void): [Store<T>, (action: A) => void];