Когда я начал работать с библиотекой-оболочкой Dexie IndexedDB, я был разочарован, увидев инструкции, указывающие вам на подкласс Dexie, чтобы использовать его с Typescript.

Я бы предпочел компонуемый шаблон, который не использует синтаксический сахар классов ES.

Вот один из способов использования Dexie и Typescript без классов.

TL;DR:

Вот CodeSandbox.

Мы начнем с импорта 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 без использования классов.