Допустимые типы ключей

Библиотека Idb-keyval предоставляет простой интерфейс для работы с IndexedDB через абстракцию ключ–значение. Правильный выбор типов ключей является критически важным для корректного хранения и извлечения данных. В IndexedDB ключи должны соответствовать определённым требованиям, и Idb-keyval наследует эти ограничения, одновременно упрощая работу с ними.


Основные правила для ключей

В Idb-keyval ключи могут быть следующих типов:

  1. Строки (string) Наиболее универсальный тип ключа. Строки могут содержать любые символы, включая пробелы, Unicode и специальные символы. Например:

    import { set, get } from 'idb-keyval';
    
    await set('user:name', 'Иван');
    const name = await get('user:name');
    console.log(name); // 'Иван'

    Особенности:

    • Строки сравниваются лексикографически.
    • Можно использовать разделители (: или .) для логической группировки данных.
  2. Числа (number) Целые числа и числа с плавающей точкой. Они подходят для индексированных коллекций или порядковых идентификаторов:

    await set(1, { score: 100 });
    const score = await get(1);
    console.log(score); // { score: 100 }

    Особенности:

    • Сравнение выполняется по числовому значению.
    • Поддерживаются отрицательные и дробные числа.
  3. Дата (Date) Можно использовать объекты Date в качестве ключей. Библиотека автоматически преобразует их в числовое представление (getTime()), совместимое с IndexedDB:

    const today = new Date();
    await set(today, 'Событие сегодня');
    const event = await get(today);
    console.log(event); // 'Событие сегодня'

    Особенности:

    • Позволяет использовать временные метки для сортировки и фильтрации.
    • Сравнение выполняется по числу миллисекунд с начала эпохи.
  4. Массивы (Array) Композитные ключи поддерживают массивы, содержащие строки, числа или даты. Используются для составных идентификаторов:

    await set(['user', 42], 'Пользователь 42');
    const user = await get(['user', 42]);
    console.log(user); // 'Пользователь 42'

    Особенности:

    • Элементы массива сравниваются по порядку.
    • Все элементы массива должны быть допустимых типов (строка, число, дата).

Недопустимые типы ключей

Idb-keyval не поддерживает следующие типы в качестве ключей:

  • Объекты ({}) и функции
  • undefined
  • Symbol
  • null допускается только как значение, но не как ключ

Использование недопустимых типов приводит к исключениям на этапе выполнения, так как IndexedDB накладывает строгие ограничения на ключи.


Рекомендации по выбору ключей

  • Последовательность и предсказуемость: строки и числа позволяют легко управлять порядком элементов.
  • Композитные ключи для сложных структур: массивы ключей упрощают поиск по нескольким критериям.
  • Использование дат для временных данных: ключи типа Date удобны для журналов событий и истории изменений.
  • Однородность типов: в одной коллекции рекомендуется использовать один тип ключей, чтобы избежать ошибок при сравнении.

Примеры комбинирования типов ключей

Комбинированные ключи позволяют строить более сложные структуры:

// Ключ: [тип объекта, id, дата]
const key = ['order', 123, new Date('2026-03-24')];
await set(key, { amount: 2500, status: 'pending' });

const order = await get(key);
console.log(order); // { amount: 2500, status: 'pending' }

Такой подход обеспечивает уникальность записи и упрощает фильтрацию по компонентам ключа, например, по типу объекта или дате создания.


Важные нюансы

  • При использовании массивов и дат ключи должны быть сериализуемыми и сравнимыми.
  • Строковые ключи чувствительны к регистру. 'User' и 'user' будут восприниматься как разные ключи.
  • Любая попытка использовать недопустимый тип ключа вызывает исключение DOMException: The provided value is not a valid key.

Idb-keyval предоставляет гибкость в выборе типов ключей, позволяя использовать строки, числа, даты и массивы для создания как простых, так и сложных схем хранения данных. Правильная организация ключей обеспечивает стабильность, предсказуемость и удобство работы с IndexedDB через эту библиотеку.