Типизация AsyncStorage в TypeScript
При использовании AsyncStorage в TypeScript важно правильно типизировать входные и выходные данные, так как сама библиотека оперирует только строками. Чтобы избежать ошибок и повысить читаемость кода, рекомендуется создавать отдельные функции-обёртки с явной типизацией.
Так как AsyncStorage хранит только строки, любые объекты или примитивы (числа, булевы значения) должны быть преобразованы перед сохранением и восстановлены при чтении. Это делает ручную сериализацию/десериализацию обязательной.
Пример типизированного сервиса для работы с токеном авторизации:
import AsyncStorage from '@react-native-async-storage/async-storage';
const TOKEN_KEY = 'auth_token';
export const saveToken = async (token: string): Promise<void> => {
try {
await AsyncStorage.setItem(TOKEN_KEY, token);
} catch (error) {
console.error('Failed to save token', error);
throw error;
}
};
export const getToken = async (): Promise<string | null> => {
try {
const token = await AsyncStorage.getItem(TOKEN_KEY);
return token; // возвращается string | null
} catch (error) {
console.error('Failed to get token', error);
return null;
}
};
export const removeToken = async (): Promise<void> => {
try {
await AsyncStorage.removeItem(TOKEN_KEY);
} catch (error) {
console.error('Failed to remove token', error);
throw error;
}
};
Для хранения структурированных данных (например, профиля пользователя) можно обобщить подход:
export const saveObject = async <T>(key: string, value: T): Promise<void> => {
try {
const jsonValue = JSON.stringify(value);
await AsyncStorage.setItem(key, jsonValue);
} catch (error) {
console.error(`Failed to save object for key: ${key}`, error);
throw error;
}
};
export const getObject = async <T>(key: string): Promise<T | null> => {
try {
const jsonValue = await AsyncStorage.getItem(key);
return jsonValue != null ? JSON.parse(jsonValue) : null;
} catch (error) {
console.error(`Failed to parse object for key: ${key}`, error);
return null;
}
};
Обратите внимание: ошибки при работе с AsyncStorage обычно связаны с нехваткой памяти, повреждением данных или превышением лимита хранилища — а не с сетевыми проблемами, так как операции происходят локально. Поэтому обработка ошибок через try/catch обязательна, даже если сеть не участвует.