Как сопоставить объявленный тип условного вывода с другим аналогичным типом условного вывода - PullRequest
0 голосов
/ 17 января 2020

Продолжить с предыдущего номера . Сейчас я определяю интерфейс API на основе IDB. Тип условного логического вывода конфликтует с типом KnownKeys, что мешает мне интегрировать объявление IDB.
Вот подробности .

interface Provider<
  Schema extends DBSchema = any,
  Mapper extends Record<string, Invoking<Schema>> = {}
  > {
  /**
   * Type 'Store' does not satisfy the constraint 'StoreNames<Schema>'.
   * Type 'DBStoreInfer<Schema, Mapper[Name]>' is not assignable to type 'StoreNames<Schema>'.(2344)
   */
  register<
    Name extends keyof Mapper,
    Store extends DBStoreInfer<Schema, Mapper[Name]>
  >(api: Api<Name, Schema, Store>): any // Error.
}

Я не знаю, как соответствовать требованию StoreNames<Schema> (реализовано KnownKeys). Даже использование S extends StoreNames<Schema> в DBStoreInfer не может решить эту проблему.
В настоящее время я хожу вокруг, используя тип IDB напрямую

...
  register<
    Name extends keyof Mapper,
    Store extends StoreNames<Schema>
  >(api: Api<Name, Schema, Store>): any // Good. But lost type validation in other class using Mapper.
...

Любой способ исправить это? Или есть идеи по переработке дизайна?

Обновление:

Я придумаю вариант использования. Он построен на базовом интерфейсе (в разработке)

// Model
type Entity = {
  id: string,
  code: string,
  data: number
}

// Somewhere in the common module.
declare const provider: DBProviderType<{
  'db-store': {
    key: string,
    value: Entity,
    indexes: {
      'db-compound-index': [string, number],
      'db-code-index': string
    }
  }
}, {
  testApi: (def: {
      store: 'db-store',
      method: 'get'
      indexes: ['code'],
      query: Entity
    }
  ) => Entity
}>

// Somewhere during app init. The Mapper type may be a subset.
// Arguments follow the structure of Mapper and Schema
provider.registerApi({
  name: 'testApi',
  store: 'db-store',
  method: 'get',
  indexes: 'db-compound-index'
})

// Somewhere in business logic
provider.invokeApi('testApi')
  .indexes('db-code-index')
  .query({
    code: 'test-code',
    data: 1001
  })
  .invoke()

Обновление 2

Другое определение для Jsonp / Ajax. Для обсуждения дизайна.

...