UNPKG

9.93 kBTypeScriptView Raw
1// Minimum TypeScript Version: 3.7
2
3/**
4 * This file is a manual translation of the flow types, which are the source of truth, so we should not introduce new terminology or behavior in this file.
5 */
6
7export {};
8
9import * as React from 'react';
10
11// state.d.ts
12type NodeKey = string;
13
14// node.d.ts
15export class DefaultValue {
16 private __tag: 'DefaultValue';
17}
18
19// recoilRoot.d.ts
20export interface RecoilRootProps {
21 initializeState?: (mutableSnapshot: MutableSnapshot) => void;
22}
23
24export const RecoilRoot: React.FC<RecoilRootProps>;
25
26// atom.d.ts
27export interface AtomOptions<T> {
28 key: NodeKey;
29 default: RecoilValue<T> | Promise<T> | T;
30 dangerouslyAllowMutability?: boolean;
31}
32/**
33 * Creates an atom, which represents a piece of writeable state
34 */
35export function atom<T>(options: AtomOptions<T>): RecoilState<T>;
36
37// selector.d.ts
38export type GetRecoilValue = <T>(recoilVal: RecoilValue<T>) => T;
39
40export type SetRecoilState = <T>(
41 recoilVal: RecoilState<T>,
42 newVal: T | DefaultValue | ((prevValue: T) => T | DefaultValue),
43) => void;
44
45export type ResetRecoilState = (recoilVal: RecoilState<any>) => void; // eslint-disable-line @typescript-eslint/no-explicit-any
46
47export interface ReadOnlySelectorOptions<T> {
48 key: string;
49 get: (opts: { get: GetRecoilValue }) => Promise<T> | RecoilValue<T> | T;
50 dangerouslyAllowMutability?: boolean;
51}
52
53export interface ReadWriteSelectorOptions<T> extends ReadOnlySelectorOptions<T> {
54 set: (
55 opts: {
56 set: SetRecoilState;
57 get: GetRecoilValue;
58 reset: ResetRecoilState;
59 },
60 newValue: T | DefaultValue,
61 ) => void;
62}
63
64export function selector<T>(options: ReadWriteSelectorOptions<T>): RecoilState<T>;
65export function selector<T>(options: ReadOnlySelectorOptions<T>): RecoilValueReadOnly<T>;
66
67// Snapshot.d.ts
68declare const SnapshotID_OPAQUE: unique symbol;
69export interface SnapshotID {
70 readonly [SnapshotID_OPAQUE]: true;
71}
72
73export class Snapshot {
74 getID(): SnapshotID;
75 getLoadable<T>(recoilValue: RecoilValue<T>): Loadable<T>;
76 getPromise<T>(recoilValue: RecoilValue<T>): Promise<T>;
77 map(cb: (mutableSnapshot: MutableSnapshot) => void): Snapshot;
78 asyncMap(cb: (mutableSnapshot: MutableSnapshot) => Promise<void>): Promise<Snapshot>;
79}
80
81export class MutableSnapshot extends Snapshot {
82 set: SetRecoilState;
83 reset: ResetRecoilState;
84}
85
86// hooks.d.ts
87export type SetterOrUpdater<T> = (valOrUpdater: ((currVal: T) => T) | T) => void;
88export type Resetter = () => void;
89export type CallbackInterface = Readonly<{
90 set: <T>(recoilVal: RecoilState<T>, valOrUpdater: ((currVal: T) => T) | T) => void;
91 reset: (recoilVal: RecoilState<any>) => void; // eslint-disable-line @typescript-eslint/no-explicit-any
92 snapshot: Snapshot,
93 gotoSnapshot: (snapshot: Snapshot) => void,
94}>;
95
96/**
97 * Returns the value of an atom or selector (readonly or writeable) and
98 * subscribes the components to future updates of that state.
99 */
100export function useRecoilValue<T>(recoilValue: RecoilValue<T>): T;
101
102/**
103 * Returns a Loadable representing the status of the given Recoil state
104 * and subscribes the component to future updates of that state. Useful
105 * for working with async selectors.
106 */
107export function useRecoilValueLoadable<T>(recoilValue: RecoilValue<T>): Loadable<T>;
108
109/**
110 * Returns a tuple where the first element is the value of the recoil state
111 * and the second is a setter to update that state. Subscribes component
112 * to updates of the given state.
113 */
114export function useRecoilState<T>(recoilState: RecoilState<T>): [T, SetterOrUpdater<T>];
115
116/**
117 * Returns a tuple where the first element is a Loadable and the second
118 * element is a setter function to update the given state. Subscribes
119 * component to updates of the given state.
120 */
121export function useRecoilStateLoadable<T>(recoilState: RecoilState<T>): [Loadable<T>, SetterOrUpdater<T>];
122
123/**
124 * Returns a setter function for updating Recoil state. Does not subscribe
125 * the component to the given state.
126 */
127
128export function useSetRecoilState<T>(recoilState: RecoilState<T>): SetterOrUpdater<T>;
129
130/**
131 * Returns a function that will reset the given state to its default value.
132 */
133export function useResetRecoilState(recoilState: RecoilState<any>): Resetter; // eslint-disable-line @typescript-eslint/no-explicit-any
134
135/**
136 * Returns a function that will run the callback that was passed when
137 * calling this hook. Useful for accessing Recoil state in response to
138 * events.
139 */
140export function useRecoilCallback<Args extends ReadonlyArray<unknown>, Return>(
141 fn: (interface: CallbackInterface) => (...args: Args) => Return,
142 deps?: ReadonlyArray<unknown>,
143): (...args: Args) => Return;
144
145export function useRecoilTransactionObserver_UNSTABLE(
146 callback: (opts: {
147 snapshot: Snapshot,
148 previousSnapshot: Snapshot,
149 }) => void,
150): void;
151
152export function useGotoRecoilSnapshot(): (snapshot: Snapshot) => void;
153
154export function useRecoilSnapshot(): Snapshot;
155
156// useRecoilBridgeAcrossReactRoots.d.ts
157export const RecoilBridge: React.FC;
158export function useRecoilBridgeAcrossReactRoots_UNSTABLE(): typeof RecoilBridge;
159
160// loadable.d.ts
161type ResolvedLoadablePromiseInfo<T> = Readonly<{
162 value: T;
163}>;
164
165export type LoadablePromise<T> = Promise<ResolvedLoadablePromiseInfo<T>>;
166
167export type Loadable<T> =
168 | Readonly<{
169 state: 'hasValue';
170 contents: T;
171 }>
172 | Readonly<{
173 state: 'hasError';
174 contents: Error;
175 }>
176 | Readonly<{
177 state: 'loading';
178 contents: LoadablePromise<T>;
179 }>;
180
181// recoilValue.d.ts
182declare class AbstractRecoilValue<T> {
183 __tag: [T];
184 __cTag: (t: T) => void; // for contravariance
185
186 key: NodeKey;
187 constructor(newKey: NodeKey);
188}
189
190declare class AbstractRecoilValueReadonly<T> {
191 __tag: [T];
192
193 key: NodeKey;
194 constructor(newKey: NodeKey);
195}
196
197export class RecoilState<T> extends AbstractRecoilValue<T> {}
198export class RecoilValueReadOnly<T> extends AbstractRecoilValueReadonly<T> {}
199export type RecoilValue<T> = RecoilValueReadOnly<T> | RecoilState<T>;
200
201export function isRecoilValue(val: unknown): val is RecoilValue<any>; // eslint-disable-line @typescript-eslint/no-explicit-any
202
203/** Utilities */
204
205// bigint not supported yet
206type Primitive = undefined | null | boolean | number | symbol | string;
207
208export type SerializableParam = Primitive | ReadonlyArray<SerializableParam> | Readonly<{[key: string]: SerializableParam}>;
209
210export interface AtomFamilyOptions<T, P extends SerializableParam> {
211 key: NodeKey;
212 dangerouslyAllowMutability?: boolean;
213 default: RecoilValue<T> | Promise<T> | T | ((param: P) => T | RecoilValue<T> | Promise<T>);
214}
215
216export function atomFamily<T, P extends SerializableParam>(
217 options: AtomFamilyOptions<T, P>,
218): (param: P) => RecoilState<T>;
219
220export interface ReadOnlySelectorFamilyOptions<T, P extends SerializableParam> {
221 key: string;
222 get: (param: P) => (opts: { get: GetRecoilValue }) => Promise<T> | RecoilValue<T> | T;
223 // cacheImplementation_UNSTABLE?: () => CacheImplementation<Loadable<T>>,
224 // cacheImplementationForParams_UNSTABLE?: () => CacheImplementation<
225 // RecoilValue<T>,
226 // >,
227 dangerouslyAllowMutability?: boolean;
228}
229
230export interface ReadWriteSelectorFamilyOptions<T, P extends SerializableParam> {
231 key: string;
232 get: (param: P) => (opts: { get: GetRecoilValue }) => Promise<T> | RecoilValue<T> | T;
233 set: (
234 param: P,
235 ) => (
236 opts: { set: SetRecoilState; get: GetRecoilValue; reset: ResetRecoilState },
237 newValue: T | DefaultValue,
238 ) => void;
239 // cacheImplementation_UNSTABLE?: () => CacheImplementation<Loadable<T>>,
240 // cacheImplementationForParams_UNSTABLE?: () => CacheImplementation<
241 // RecoilValue<T>,
242 // >,
243 dangerouslyAllowMutability?: boolean;
244}
245
246export function selectorFamily<T, P extends SerializableParam>(
247 options: ReadWriteSelectorFamilyOptions<T, P>,
248): (param: P) => RecoilState<T>;
249
250export function selectorFamily<T, P extends SerializableParam>(
251 options: ReadOnlySelectorFamilyOptions<T, P>,
252): (param: P) => RecoilValueReadOnly<T>;
253
254export function constSelector<T extends SerializableParam>(constant: T): RecoilValueReadOnly<T>;
255
256export function errorSelector(message: string): RecoilValueReadOnly<never>;
257
258export function readOnlySelector<T>(atom: RecoilValue<T>): RecoilValueReadOnly<T>;
259
260export function noWait<T>(state: RecoilValue<T>): RecoilValueReadOnly<Loadable<T>>;
261
262/* eslint-disable @typescript-eslint/no-explicit-any */
263
264export type UnwrapRecoilValue<T> = T extends RecoilValue<infer R> ? R : never;
265
266export type UnwrapRecoilValues<T extends Array<RecoilValue<any>> | { [key: string]: RecoilValue<any> }> = {
267 [P in keyof T]: UnwrapRecoilValue<T[P]>;
268};
269export type UnwrapRecoilValueLoadables<T extends Array<RecoilValue<any>> | { [key: string]: RecoilValue<any> }> = {
270 [P in keyof T]: Loadable<UnwrapRecoilValue<T[P]>>;
271};
272
273export function waitForNone<RecoilValues extends Array<RecoilValue<any>> | [RecoilValue<any>]>(
274 param: RecoilValues,
275): RecoilValueReadOnly<UnwrapRecoilValueLoadables<RecoilValues>>;
276
277export function waitForNone<RecoilValues extends { [key: string]: RecoilValue<any> }>(
278 param: RecoilValues,
279): RecoilValueReadOnly<UnwrapRecoilValueLoadables<RecoilValues>>;
280
281export function waitForAny<RecoilValues extends Array<RecoilValue<any>> | [RecoilValue<any>]>(
282 param: RecoilValues,
283): RecoilValueReadOnly<UnwrapRecoilValueLoadables<RecoilValues>>;
284
285export function waitForAny<RecoilValues extends { [key: string]: RecoilValue<any> }>(
286 param: RecoilValues,
287): RecoilValueReadOnly<UnwrapRecoilValueLoadables<RecoilValues>>;
288
289export function waitForAll<RecoilValues extends Array<RecoilValue<any>> | [RecoilValue<any>]>(
290 param: RecoilValues,
291): RecoilValueReadOnly<UnwrapRecoilValues<RecoilValues>>;
292
293export function waitForAll<RecoilValues extends { [key: string]: RecoilValue<any> }>(
294 param: RecoilValues,
295): RecoilValueReadOnly<UnwrapRecoilValues<RecoilValues>>;
296
297/* eslint-enable @typescript-eslint/no-explicit-any */