Продолжить с предыдущего номера . Сейчас я определяю интерфейс 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. Для обсуждения дизайна.