Skip to content

Commit 4d30fc2

Browse files
authored
Flow support from ifsnow/feature/support-flow
Flow support
2 parents 65341b8 + 5f63b09 commit 4d30fc2

File tree

2 files changed

+50
-33
lines changed

2 files changed

+50
-33
lines changed

example/src/examples/GetSet.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ import AsyncStorage from '@react-native-community/async-storage';
1515

1616
type Props = {};
1717
type State = {
18-
storedNumber: number,
18+
storedNumber: string,
1919
needRestart: boolean,
2020
};
2121
export default class GetSet extends Component<Props, State> {
2222
state = {
23-
storedNumber: -1,
23+
storedNumber: '',
2424
needRestart: false,
2525
};
2626

@@ -34,8 +34,8 @@ export default class GetSet extends Component<Props, State> {
3434
}
3535

3636
storeRandom = async () => {
37-
const randomNum = Math.round(Math.random() * 100);
38-
await AsyncStorage.setItem(STORAGE_KEY, `${randomNum}`);
37+
const randomNum = Math.round(Math.random() * 100).toString();
38+
await AsyncStorage.setItem(STORAGE_KEY, randomNum);
3939

4040
this.setState({storedNumber: randomNum, needRestart: true});
4141
};

lib/AsyncStorage.js

Lines changed: 46 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
* LICENSE file in the root directory of this source tree.
66
*
77
* @format
8-
* @noflow
9-
* @flow-weak
8+
* @flow
109
* @jsdoc
1110
*/
1211

@@ -21,6 +20,21 @@ const RCTAsyncStorage =
2120
NativeModules.RNC_AsyncSQLiteDBStorage ||
2221
NativeModules.AsyncLocalStorage;
2322

23+
type ReadOnlyArrayString = $ReadOnlyArray<string>;
24+
25+
type MultiGetCallbackFunction = (
26+
errors: ?$ReadOnlyArray<Error>,
27+
result: ?$ReadOnlyArray<ReadOnlyArrayString>,
28+
) => void;
29+
30+
type MultiRequest = {|
31+
keys: $ReadOnlyArray<string>,
32+
callback: ?MultiGetCallbackFunction,
33+
keyIndex: number,
34+
resolve: ?(result?: Promise<?$ReadOnlyArray<ReadOnlyArrayString>>) => void,
35+
reject: ?(error?: any) => void,
36+
|};
37+
2438
/**
2539
* `AsyncStorage` is a simple, unencrypted, asynchronous, persistent, key-value
2640
* storage system that is global to the app. It should be used instead of
@@ -29,7 +43,7 @@ const RCTAsyncStorage =
2943
* See http://facebook.github.io/react-native/docs/asyncstorage.html
3044
*/
3145
const AsyncStorage = {
32-
_getRequests: ([]: Array<any>),
46+
_getRequests: ([]: Array<MultiRequest>),
3347
_getKeys: ([]: Array<string>),
3448
_immediate: (null: ?number),
3549

@@ -40,8 +54,8 @@ const AsyncStorage = {
4054
*/
4155
getItem: function(
4256
key: string,
43-
callback?: ?(error: ?Error, result: ?string) => void,
44-
): Promise {
57+
callback?: ?(error: ?Error, result: string | null) => void,
58+
): Promise<string | null> {
4559
return new Promise((resolve, reject) => {
4660
RCTAsyncStorage.multiGet([key], function(errors, result) {
4761
// Unpack result to get value from [[key,value]]
@@ -66,7 +80,7 @@ const AsyncStorage = {
6680
key: string,
6781
value: string,
6882
callback?: ?(error: ?Error) => void,
69-
): Promise {
83+
): Promise<null> {
7084
return new Promise((resolve, reject) => {
7185
RCTAsyncStorage.multiSet([[key, value]], function(errors) {
7286
const errs = convertErrors(errors);
@@ -88,7 +102,7 @@ const AsyncStorage = {
88102
removeItem: function(
89103
key: string,
90104
callback?: ?(error: ?Error) => void,
91-
): Promise {
105+
): Promise<null> {
92106
return new Promise((resolve, reject) => {
93107
RCTAsyncStorage.multiRemove([key], function(errors) {
94108
const errs = convertErrors(errors);
@@ -114,7 +128,7 @@ const AsyncStorage = {
114128
key: string,
115129
value: string,
116130
callback?: ?(error: ?Error) => void,
117-
): Promise {
131+
): Promise<null> {
118132
return new Promise((resolve, reject) => {
119133
RCTAsyncStorage.multiMerge([[key, value]], function(errors) {
120134
const errs = convertErrors(errors);
@@ -135,12 +149,13 @@ const AsyncStorage = {
135149
*
136150
* See http://facebook.github.io/react-native/docs/asyncstorage.html#clear
137151
*/
138-
clear: function(callback?: ?(error: ?Error) => void): Promise {
152+
clear: function(callback?: ?(error: ?Error) => void): Promise<null> {
139153
return new Promise((resolve, reject) => {
140154
RCTAsyncStorage.clear(function(error) {
141-
callback && callback(convertError(error));
142-
if (error && convertError(error)) {
143-
reject(convertError(error));
155+
const err = convertError(error);
156+
callback && callback(err);
157+
if (err) {
158+
reject(err);
144159
} else {
145160
resolve(null);
146161
}
@@ -154,13 +169,14 @@ const AsyncStorage = {
154169
* See http://facebook.github.io/react-native/docs/asyncstorage.html#getallkeys
155170
*/
156171
getAllKeys: function(
157-
callback?: ?(error: ?Error, keys: ?Array<string>) => void,
158-
): Promise {
172+
callback?: ?(error: ?Error, keys: ?ReadOnlyArrayString) => void,
173+
): Promise<ReadOnlyArrayString> {
159174
return new Promise((resolve, reject) => {
160175
RCTAsyncStorage.getAllKeys(function(error, keys) {
161-
callback && callback(convertError(error), keys);
162-
if (error) {
163-
reject(convertError(error));
176+
const err = convertError(error);
177+
callback && callback(err, keys);
178+
if (err) {
179+
reject(err);
164180
} else {
165181
resolve(keys);
166182
}
@@ -223,16 +239,16 @@ const AsyncStorage = {
223239
*/
224240
multiGet: function(
225241
keys: Array<string>,
226-
callback?: ?(errors: ?Array<Error>, result: ?Array<Array<string>>) => void,
227-
): Promise {
242+
callback?: ?MultiGetCallbackFunction,
243+
): Promise<?$ReadOnlyArray<ReadOnlyArrayString>> {
228244
if (!this._immediate) {
229245
this._immediate = setImmediate(() => {
230246
this._immediate = null;
231247
this.flushGetRequests();
232248
});
233249
}
234250

235-
const getRequest = {
251+
const getRequest: MultiRequest = {
236252
keys: keys,
237253
callback: callback,
238254
// do we need this?
@@ -265,8 +281,8 @@ const AsyncStorage = {
265281
*/
266282
multiSet: function(
267283
keyValuePairs: Array<Array<string>>,
268-
callback?: ?(errors: ?Array<Error>) => void,
269-
): Promise {
284+
callback?: ?(errors: ?$ReadOnlyArray<?Error>) => void,
285+
): Promise<null> {
270286
return new Promise((resolve, reject) => {
271287
RCTAsyncStorage.multiSet(keyValuePairs, function(errors) {
272288
const error = convertErrors(errors);
@@ -287,8 +303,8 @@ const AsyncStorage = {
287303
*/
288304
multiRemove: function(
289305
keys: Array<string>,
290-
callback?: ?(errors: ?Array<Error>) => void,
291-
): Promise {
306+
callback?: ?(errors: ?$ReadOnlyArray<?Error>) => void,
307+
): Promise<null> {
292308
return new Promise((resolve, reject) => {
293309
RCTAsyncStorage.multiRemove(keys, function(errors) {
294310
const error = convertErrors(errors);
@@ -312,8 +328,8 @@ const AsyncStorage = {
312328
*/
313329
multiMerge: function(
314330
keyValuePairs: Array<Array<string>>,
315-
callback?: ?(errors: ?Array<Error>) => void,
316-
): Promise {
331+
callback?: ?(errors: ?$ReadOnlyArray<?Error>) => void,
332+
): Promise<null> {
317333
return new Promise((resolve, reject) => {
318334
RCTAsyncStorage.multiMerge(keyValuePairs, function(errors) {
319335
const error = convertErrors(errors);
@@ -334,19 +350,20 @@ if (!RCTAsyncStorage.multiMerge) {
334350
delete AsyncStorage.multiMerge;
335351
}
336352

337-
function convertErrors(errs) {
353+
function convertErrors(errs): ?$ReadOnlyArray<?Error> {
338354
if (!errs) {
339355
return null;
340356
}
341357
return (Array.isArray(errs) ? errs : [errs]).map(e => convertError(e));
342358
}
343359

344-
function convertError(error) {
360+
function convertError(error): ?Error {
345361
if (!error) {
346362
return null;
347363
}
348364
const out = new Error(error.message);
349-
out.key = error.key; // flow doesn't like this :(
365+
// $FlowFixMe: adding custom properties to error.
366+
out.key = error.key;
350367
return out;
351368
}
352369

0 commit comments

Comments
 (0)