typesense / typesense-js

JavaScript / TypeScript client for Typesense
https://typesense.org/docs/api
Apache License 2.0
400 stars 74 forks source link

Generic type for documents improvement #152

Open flevi29 opened 1 year ago

flevi29 commented 1 year ago

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 1 year ago

Also should these types be recursive for the new object and object[] field types?