mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-01-19 06:21:46 +01:00
fix(components): improve generic types (#3331)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import type { AcceptableValue as _AcceptableValue } from 'reka-ui'
|
||||
import type { VNode } from 'vue'
|
||||
|
||||
export interface TightMap<O = any> {
|
||||
@@ -14,8 +15,19 @@ export type DeepPartial<T, O = any> = {
|
||||
[key: string]: O | TightMap<O>
|
||||
}
|
||||
|
||||
export type DynamicSlots<T extends { slot?: string }, SlotProps, Slot = T['slot']> =
|
||||
Record<string, SlotProps> & (Slot extends string ? Record<Slot, SlotProps> : Record<string, never>)
|
||||
export type DynamicSlots<
|
||||
T extends { slot?: string },
|
||||
S extends string | undefined = undefined,
|
||||
D extends object = {}
|
||||
> = {
|
||||
[
|
||||
K in T['slot'] as K extends string
|
||||
? S extends string
|
||||
? (K | `${K}-${S}`)
|
||||
: K
|
||||
: never
|
||||
]?: (props: { item: Extract<T, { slot: K extends `${infer Base}-${S}` ? Base : K }> } & D) => any
|
||||
}
|
||||
|
||||
export type GetObjectField<MaybeObject, Key extends string> = MaybeObject extends Record<string, any>
|
||||
? MaybeObject[Key]
|
||||
@@ -25,18 +37,49 @@ export type PartialString<T> = {
|
||||
[K in keyof T]?: string
|
||||
}
|
||||
|
||||
export type MaybeArrayOfArray<T> = T[] | T[][]
|
||||
export type MaybeArrayOfArrayItem<I> = I extends Array<infer T> ? T extends Array<infer U> ? U : T : never
|
||||
|
||||
export type SelectModelValue<T, V, M extends boolean = false, DV = T> = (T extends Record<string, any> ? V extends keyof T ? T[V] : DV : T) extends infer U ? M extends true ? U[] : U : never
|
||||
|
||||
export type SelectItemKey<T> = T extends Record<string, any> ? keyof T : string
|
||||
|
||||
export type SelectModelValueEmits<T, V, M extends boolean = false, DV = T> = {
|
||||
'update:modelValue': [payload: SelectModelValue<T, V, M, DV>]
|
||||
export type AcceptableValue = Exclude<_AcceptableValue, Record<string, any>>
|
||||
export type ArrayOrNested<T> = T[] | T[][]
|
||||
export type NestedItem<T> = T extends Array<infer I> ? NestedItem<I> : T
|
||||
type AllKeys<T> = T extends any ? keyof T : never
|
||||
type NonCommonKeys<T extends object> = Exclude<AllKeys<T>, keyof T>
|
||||
type PickTypeOf<T, K extends string | number | symbol> = K extends AllKeys<T>
|
||||
? T extends { [k in K]?: any }
|
||||
? T[K]
|
||||
: undefined
|
||||
: never
|
||||
export type MergeTypes<T extends object> = {
|
||||
[k in keyof T]: PickTypeOf<T, k>;
|
||||
} & {
|
||||
[k in NonCommonKeys<T>]?: PickTypeOf<T, k>;
|
||||
}
|
||||
|
||||
export type MaybeMultipleModelValue<T, M extends boolean = false> = (T extends infer U ? M extends true ? U[] : U : never)
|
||||
export type GetItemKeys<I> = keyof 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]
|
||||
: never
|
||||
: T
|
||||
|
||||
export type GetModelValue<
|
||||
T,
|
||||
VK extends GetItemKeys<T> | undefined,
|
||||
M extends boolean
|
||||
> = M extends true
|
||||
? GetItemValue<T, VK>[]
|
||||
: GetItemValue<T, VK>
|
||||
|
||||
export type GetModelValueEmits<
|
||||
T,
|
||||
VK extends GetItemKeys<T> | undefined,
|
||||
M extends boolean
|
||||
> = {
|
||||
/** Event handler called when the value changes. */
|
||||
'update:modelValue': [payload: GetModelValue<T, VK, M>]
|
||||
}
|
||||
|
||||
export type StringOrVNode =
|
||||
| string
|
||||
|
||||
Reference in New Issue
Block a user