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 */
3145const 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