@vimirtv

Как произвести такую типизацию?

Начинаю изучать TypeScript, и возникло сложность с понимаем как типизировать такие конструкции.
Например есть три метода для работы с AsyncStorage в react native.

import AsyncStorage from '@react-native-community/async-storage';

//чтение данных
export async function getKey(key: string):Promise<string | null> {
    try {
        const value = await AsyncStorage.getItem(key);
        return value
    } catch (error) {
        return error
    }
}
//запись
export async function saveKey(key: string, value: string):Promise<void | Error> {
    try {
        await AsyncStorage.setItem(key, value);
    } catch (error) {
        return error
    }
}
//удаление
export async function removeItemKey(key: string):Promise<void | Error> {
    try {
      await AsyncStorage.removeItem(key);
    } catch (error) {
        return error
    }
}


При вызове например getKey() я хочу добиться, чтобы в него можно было передавать только определённые значения.
В моем случае это theme или auth. И если это getKey('theme') получить я должен только 'light' | 'dark' | null

type StoreTypes = {
    theme: 'light' | 'dark' | null
    auth: 'true' | 'false' | null
}
  • Вопрос задан
  • 216 просмотров
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
Расписывать с честными промисами мне лень, но идея такая
// Эта функция определена где-то в другом месте (для примера вместо AsyncStorage)
declare function someMagic(key: string): string | null;

type StoreTypes = {
    theme: 'light' | 'dark' | null;
    auth: 'true' | 'false' | null;
}

// Собственно декларация функции
function getKey<K extends keyof StoreTypes>(key: K): StoreTypes[K] {
    return someMagic(key) as StoreTypes[K];
}

// type t = "light" | "dark" | null
const t = getKey('theme');
// type a = "true" | "false" | null
const a = getKey('auth');
// ошибка "test" не является ключом в StoreTypes
const x = getKey('test');


https://www.typescriptlang.org/play?#code/PTAEloQQ...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы