Skip to content

Types Helpers

ts
export type Data<T = any> = Record<string, T>

export type TreeNode<T = Data> = T & { children?: TreeNode<T>[] }
ts
import type Node from 'element-plus/es/components/tree/src/model/node'
import type { ComponentSize } from 'element-plus'

export type ElSize = ComponentSize
export type ElTreeNode = Node
ts
// lodash.get

type GetIndexedField<T, K> = K extends keyof T
  ? T[K]
  : K extends `${number}`
    ? 'length' extends keyof T
      ? number extends T['length']
        ? number extends keyof T
          ? T[number]
          : undefined
        : undefined
      : undefined
    : undefined

type FieldWithPossiblyUndefined<T, Key> = GetFieldType<Exclude<T, undefined>, Key> | Extract<T, undefined>

type IndexedFieldWithPossiblyUndefined<T, Key> = GetIndexedField<Exclude<T, undefined>, Key> | Extract<T, undefined>

export type GetFieldType<T, P> = P extends `${infer Left}.${infer Right}`
  ? Left extends keyof Exclude<T, undefined>
    ? FieldWithPossiblyUndefined<Exclude<T, undefined>[Left], Right> | Extract<T, undefined>
    : Left extends `${infer FieldKey}[${infer IndexKey}]`
      ? FieldKey extends keyof T
        ? FieldWithPossiblyUndefined<IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>, Right>
        : undefined
      : undefined
  : P extends keyof T
    ? T[P]
    : P extends `${infer FieldKey}[${infer IndexKey}]`
      ? FieldKey extends keyof T
        ? IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>
        : undefined
      : IndexedFieldWithPossiblyUndefined<T, P>
ts
export interface Page extends Sort {
  current?: number
  size?: number
  /** @deprecated */
  pageNum?: number
  /** @deprecated */
  pageSize?: number
}

export interface Sort {
  ascs?: string
  descs?: string
  /** @deprecated */
  order?: string
  /** @deprecated */
  prop?: string
}

export type Res<T = any> = { code: number, msg: string } & T

export type ResData<T = any> = Res<{ data: T }>

export type ResRows<T = any> = Res<{ rows: T, total: number }>

export type ResRecords<T = any> = ResData<{ records: T, current: number, pages: number, size: number, total: number }>