Generic type for documents improvement
flevi29 opened this issue · 1 comments
flevi29 commented
Generic type for Documents
can be enhanced. I propose the following change to DocumentSchema
:
// schema must include at least an `id`
export type DocumentSchema = { id: string; [name: string]: any }
// if property can be undefined also make it nullable
type CreatableDocumentSchema<TDocument extends DocumentSchema> = {
[name in keyof TDocument]: undefined extends Extract<TDocument[name], undefined>
? TDocument[name] | null
: TDocument[name]
}
// if property can be undefined also make it nullable, and make everything else possibly undefined as well
// except `id`
type UpdatableDocumentSchema<TDocument extends DocumentSchema> = Pick<TDocument, 'id'> & {
[name in keyof Omit<TDocument, 'id'>]?: undefined extends Extract<TDocument[name], undefined>
? TDocument[name] | null
: TDocument[name]
}
I propose to extend ImportResponseFail
to include the type of the document:
export interface ImportResponseFail<TDocument extends DocumentSchema> {
success: false
error: string
document: TDocument
code: number
}
With these modifications we can now be more specific for instance in import
:
async import<TOptions extends DocumentImportParameters>(
documents: (TOptions['action'] extends 'update' | 'emplace'
? UpdatableDocumentSchema<T>
: CreatableDocumentSchema<T>)[],
options?: TOptions
): Promise<ImportResponse<T>[]>
I'd also like to propose a type generator based on collection fields
schema if this gets approved later.
flevi29 commented
Also should these types be recursive for the new object
and object[]
field types?