Skip to content

Commit 2f440d7

Browse files
authored
Merge pull request #254 from douugbr/fix-usemmkv-typing
Fix useMMKVStorage typing and falsy values persistance
2 parents afd83c4 + 32d740a commit 2f440d7

File tree

4 files changed

+80
-17
lines changed

4 files changed

+80
-17
lines changed

dist/src/hooks/useMMKV.d.ts

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,22 @@ import MMKVInstance from '../mmkvinstance';
2020
* @param storage The storage instance
2121
* @returns `useMMKVStorage` hook
2222
*/
23-
export declare const create: <T>(storage: MMKVInstance) => (key: string, defaultValue?: any) => [value: T | null | undefined, setValue: (value: T | ((prevValue: T | null | undefined) => T)) => void];
23+
export declare const create: CreateType;
24+
/**
25+
* Types curried function to return differently based on the
26+
* absence of the `defaultValue` parameter.
27+
* @see {@link UseMMKVStorageType}
28+
*/
29+
declare type CreateType = (storage: MMKVInstance) => {
30+
<T = undefined>(key: string): [
31+
value: T | undefined,
32+
setValue: (value: (T | undefined) | ((prevValue: T | undefined) => T | undefined)) => void
33+
];
34+
<T>(key: string, defaultValue: T): [
35+
value: T,
36+
setValue: (value: T | ((prevValue: T) => T)) => void
37+
];
38+
};
2439
/**
2540
*
2641
* useMMKVStorage Hook is like a persisted state that will always write every change in storage and update your app UI instantly.
@@ -46,5 +61,20 @@ export declare const create: <T>(storage: MMKVInstance) => (key: string, default
4661
*
4762
* @returns `[value,setValue]`
4863
*/
49-
export declare const useMMKVStorage: <T>(key: string, storage: MMKVInstance, defaultValue?: T | null | undefined) => [value: T | null | undefined, setValue: (value: T | ((prevValue: T | null | undefined) => T)) => void];
64+
export declare const useMMKVStorage: UseMMKVStorageType;
65+
/**
66+
* Uses typescript's {@link https://www.typescriptlang.org/docs/handbook/interfaces.html#function-types anonymous function overloading}
67+
* to mimic React's `useState` typing.
68+
*/
69+
declare type UseMMKVStorageType = {
70+
<T = undefined>(key: string, storage: MMKVInstance): [
71+
value: T | undefined,
72+
setValue: (value: (T | undefined) | ((prevValue: T | undefined) => T | undefined)) => void
73+
];
74+
<T>(key: string, storage: MMKVInstance, defaultValue: T | undefined): [
75+
value: T,
76+
setValue: (value: T | ((prevValue: T) => T)) => void
77+
];
78+
};
79+
export {};
5080
//# sourceMappingURL=useMMKV.d.ts.map

dist/src/hooks/useMMKV.d.ts.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/src/hooks/useMMKV.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,10 @@ export var useMMKVStorage = function (key, storage, defaultValue) {
166166
return [2 /*return*/];
167167
});
168168
}); }, [key, storage, valueType]);
169-
defaultValue = defaultValue === undefined ? null : defaultValue;
170-
return [valueType === 'boolean' ? value : value || defaultValue, setNewValue];
169+
return [
170+
valueType === 'boolean' || valueType === 'number' ? value : value || defaultValue,
171+
setNewValue
172+
];
171173
};
172174
function usePrevious(value) {
173175
var ref = useRef(value);

src/hooks/useMMKV.ts

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,31 @@ import { getDataType, getInitialValue } from './functions';
2424
* @param storage The storage instance
2525
* @returns `useMMKVStorage` hook
2626
*/
27-
export const create =
28-
<T>(storage: MMKVInstance) =>
29-
(key: string, defaultValue?: any) => {
27+
export const create: CreateType =
28+
(storage: MMKVInstance) =>
29+
<T = undefined>(key: string, defaultValue?: T) => {
3030
if (!key || typeof key !== 'string' || !storage)
3131
throw new Error('Key and Storage are required parameters.');
32+
3233
return useMMKVStorage<T>(key, storage, defaultValue);
3334
};
3435

36+
/**
37+
* Types curried function to return differently based on the
38+
* absence of the `defaultValue` parameter.
39+
* @see {@link UseMMKVStorageType}
40+
*/
41+
type CreateType = (storage: MMKVInstance) => {
42+
<T = undefined>(key: string): [
43+
value: T | undefined,
44+
setValue: (value: (T | undefined) | ((prevValue: T | undefined) => T | undefined)) => void
45+
];
46+
<T>(key: string, defaultValue: T): [
47+
value: T,
48+
setValue: (value: T | ((prevValue: T) => T)) => void
49+
];
50+
};
51+
3552
/**
3653
*
3754
* useMMKVStorage Hook is like a persisted state that will always write every change in storage and update your app UI instantly.
@@ -57,18 +74,15 @@ export const create =
5774
*
5875
* @returns `[value,setValue]`
5976
*/
60-
export const useMMKVStorage = <T>(
77+
export const useMMKVStorage: UseMMKVStorageType = <T = undefined>(
6178
key: string,
6279
storage: MMKVInstance,
63-
defaultValue?: T | null | undefined
64-
): [
65-
value: T | null | undefined,
66-
setValue: (value: T | ((prevValue: T | null | undefined) => T)) => void
67-
] => {
80+
defaultValue?: T
81+
) => {
6882
const getValue = useCallback(getInitialValue(key, storage, 'value'), [key, storage]);
6983
const getValueType = useCallback(getInitialValue(key, storage, 'type'), [key, storage]);
7084

71-
const [value, setValue] = useState<T | null | undefined>(getValue);
85+
const [value, setValue] = useState<typeof defaultValue>(getValue);
7286
const [valueType, setValueType] = useState(getValueType);
7387

7488
const prevKey = usePrevious(key);
@@ -154,8 +168,10 @@ export const useMMKVStorage = <T>(
154168
[key, storage, valueType]
155169
);
156170

157-
defaultValue = defaultValue === undefined ? null : defaultValue;
158-
return [valueType === 'boolean' ? value : value || defaultValue, setNewValue];
171+
return [
172+
valueType === 'boolean' || valueType === 'number' ? value : value || defaultValue,
173+
setNewValue
174+
];
159175
};
160176

161177
function usePrevious(value: any) {
@@ -167,3 +183,18 @@ function usePrevious(value: any) {
167183

168184
return ref.current;
169185
}
186+
187+
/**
188+
* Uses typescript's {@link https://www.typescriptlang.org/docs/handbook/interfaces.html#function-types anonymous function overloading}
189+
* to mimic React's `useState` typing.
190+
*/
191+
type UseMMKVStorageType = {
192+
<T = undefined>(key: string, storage: MMKVInstance): [
193+
value: T | undefined,
194+
setValue: (value: (T | undefined) | ((prevValue: T | undefined) => T | undefined)) => void
195+
];
196+
<T>(key: string, storage: MMKVInstance, defaultValue: T | undefined): [
197+
value: T,
198+
setValue: (value: T | ((prevValue: T) => T)) => void
199+
];
200+
};

0 commit comments

Comments
 (0)