Когда я начал работать с библиотекой-оболочкой Dexie IndexedDB, я был разочарован, увидев инструкции, указывающие вам на подкласс Dexie
, чтобы использовать его с Typescript.
Я бы предпочел компонуемый шаблон, который не использует синтаксический сахар классов ES.
Вот один из способов использования Dexie и Typescript без классов.
TL;DR:
Мы начнем с импорта Dexie
как BaseDexie
, чтобы при желании мы могли реэкспортировать расширенный универсальный типDexie
. Мы создадим тип DexieTables
, который мы можем использовать для реализации нашего универсального.
// db/index.ts import BaseDexie from 'dexie'; type DexieTables = {}; export type Dexie<T extends any = DexieTables> = BaseDexie & T; export const db = new BaseDexie('j5bot') as Dexie;
В отдельном файле, чтобы все можно было компоновать, мы создаем нашу первую таблицу/коллекцию:
// db/tables/friends.ts import { Table } from 'dexie'; export type Friend = { id?: number; name: string; age: number; }; export type FriendsTable = { friends: Table<Friend>; }; export const friendsSchema = { friends: '++id, name, age' };
Затем мы обновляем db/index.ts
, чтобы добавить нашу таблицу друзей.
// db/index.ts import BaseDexie from 'dexie'; import { friendsSchema, FriendsTable } from './tables/friends'; type DexieTables = FriendsTable; export type Dexie<T extends any = DexieTables> = BaseDexie & T; export const db = new BaseDexie('j5bot') as Dexie; const schema = Object.assign({}, friendsSchema); db.version(1).stores(schema);
Для каждой имеющейся у нас таблицы мы реализуем файл в соответствии с шаблоном db/tables/friends.ts
, а затем добавляем тип и схему в db/index.ts
следующим образом.
// db/index.ts import BaseDexie from 'dexie'; // import all of the table types and schemas import { enemiesSchema, EnemiesTable } from './tables/enemies'; import { familyMembersSchema, FamilyMembersTable, } from './tables/familyMembers'; import { friendsSchema, FriendsTable } from './tables/friends'; // add table types to union type type DexieTables = & EnemiesTable & FamilyMembersTable & FriendsTable; export type Dexie<T extends any = DexieTables> = BaseDexie & T; export const db = new BaseDexie('j5bot') as Dexie; // add schemas to array const schema = Object.assign({}, enemiesSchema, familyMembersSchema, friendsSchema, ); db.version(1).stores(schema);
В целом, это должно предоставить вам типобезопасный композиционный шаблон для использования Dexie с Typescript без использования классов.