/
index.d.ts
114 lines (93 loc) · 2.72 KB
/
index.d.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import {
ComponentType,
ComponentProps,
FunctionComponent,
Component
} from "react";
interface Scheduler {
add: Function;
delete: Function;
}
interface ObserveOptions {
scheduler?: Scheduler | Function;
debugger?: Function;
lazy?: boolean;
}
type Store = {
state?: object;
actions?: object;
};
type ResolveState<State> = {
[P in keyof State]: State[P] extends (state: object) => any
? ReturnType<State[P]>
: ResolveState<State[P]>
};
type ResolveActions<Actions> = {
[P in keyof Actions]: Actions[P] extends (
...a: any
) => (arg: infer Arg) => void
? (arg: Arg) => void
: Actions[P] extends (state: object) => any
? () => void
: ResolveActions<Actions[P]>
};
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type FilterInjectedProps<T extends Store> = Omit<T, "state" | "actions">;
export type Action<St extends Store, Input = null> = [Input] extends [null]
? (
store: Omit<St, "state" | "actions"> & {
state: ResolveState<St["state"]>;
actions: ResolveActions<St["actions"]>;
}
) => void
: (
store: Omit<St, "state" | "actions"> & {
state: ResolveState<St["state"]>;
actions: ResolveActions<St["actions"]>;
}
) => (input: Input) => void;
export type Derived<St extends Store, InputOrOutput, Output = null> = [
Output
] extends [null]
? ({ state }: { state: ResolveState<St["state"]> }) => InputOrOutput
: ({
state
}: {
state: ResolveState<St["state"]>;
}) => (input: InputOrOutput) => Output;
export type Connect<St extends Store, Props extends object = {}> = Omit<
St,
"state" | "actions"
> & {
state: ResolveState<St["state"]>;
actions: ResolveActions<St["actions"]>;
} & Props;
export function observable<Observable extends object>(
obj?: Observable
): Observable;
export function isObservable(obj: object): boolean;
export function raw<Observable extends object>(obj: Observable): Observable;
export function observe<Reaction extends Function>(
func: Reaction,
options?: ObserveOptions
): Reaction;
export function unobserve(func: Function): void;
export function batch<T = any>(
fn: (...args: any[]) => T,
ctx?: any,
args?: any[]
): T;
export type InitializedStore<St extends Store = Store> = Omit<
St,
"state" | "actions"
> & {
state: ResolveState<St["state"]>;
actions: ResolveActions<St["actions"]>;
getSnapshot: () => St["state"];
};
export function createStore<St extends Store>(store: St): InitializedStore<St>;
declare function connect<Props extends object>(
Component: React.ComponentType<Props>
): FunctionComponent<FilterInjectedProps<Props>>;
export const Provider: React.ProviderExoticComponent<React.ProviderProps<any>>;
export default connect;