Skip to content

Generic type for documents improvement #152

Open
@flevi29

Description

@flevi29

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions