Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Next Next commit
fix: dot notation support in type utils
  • Loading branch information
sandros94 committed Sep 9, 2025
commit 89602dbea8971d901b29de8393b9f6acf63762c7
24 changes: 21 additions & 3 deletions src/runtime/types/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,32 @@ export type MergeTypes<T extends object> = {
[k in NonCommonKeys<T>]?: PickTypeOf<T, k>;
}

export type GetItemKeys<I> = keyof Extract<NestedItem<I>, object>
type DotPathKeys<T> = T extends object
? {
[K in keyof T & string]:
T[K] extends Record<string, any>
? K | `${K}.${DotPathKeys<T[K]>}`
: K
}[keyof T & string]
: never

type DotPathValue<T, P extends DotPathKeys<T> | (string & {})>
= P extends `${infer K}.${infer Rest}`
? K extends keyof T
? DotPathValue<T[K], Rest>
: never
: P extends keyof T
? T[P]
: never

export type GetItemKeys<I> = keyof Extract<NestedItem<I>, object> | DotPathKeys<Extract<NestedItem<I>, object>>

export type GetItemValue<I, VK extends GetItemKeys<I> | undefined, T extends NestedItem<I> = NestedItem<I>>
= T extends object
? VK extends undefined
? T
: VK extends keyof T
? T[VK]
: VK extends DotPathKeys<T>
? DotPathValue<T, VK>
: never
: T

Expand Down
8 changes: 4 additions & 4 deletions src/runtime/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { isEqual } from 'ohash/utils'
import type { GetItemKeys, NestedItem } from '../types/utils'
import type { GetItemKeys } from '../types/utils'

export function pick<Data extends object, Keys extends keyof Data>(data: Data, keys: Keys[]): Pick<Data, Keys> {
const result = {} as Pick<Data, Keys>
Expand Down Expand Up @@ -120,12 +120,12 @@ export function isEmpty(value: unknown): boolean {
return false
}

export function getDisplayValue<T, V>(
items: T[],
export function getDisplayValue<T extends Array<any>, V>(
items: T,
value: V | undefined | null,
options: {
valueKey?: GetItemKeys<T>
labelKey?: keyof NestedItem<T>
labelKey?: GetItemKeys<T>
} = {}
): string | undefined {
const { valueKey, labelKey } = options
Expand Down