Типизация 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 обязательна, даже если сеть не участвует.