UNPKG

veui

Version:

Baidu Enterprise UI for Vue.js.

106 lines (92 loc) 1.98 kB
import { KeyType } from './utils' import { OverlayClassAndStyle } from './shared' export type UiMixin = { props: { ui?: string } } export type FocusableMixin = { methods: { focus(): void } } export type ActivatableMixin = { methods: { activate(): void } } export type ControllableMixin<Emits extends Record<any, Function>> = { emits: Emits } export type OverlayMixin = { props: OverlayClassAndStyle } type MergeChecked = 'keep-all' | 'upwards' | 'downwards' export type TreeMixin = { props: { mergeChecked?: MergeChecked } } export type TreeMixinWithIndeterminate = { props: { mergeChecked?: MergeChecked includeIndeterminate?: boolean } } export type Mix = { props?: Record<string, unknown> methods?: Record<string, Function> emits?: Record<string, Function> } export type MultiMixin< T extends Array<Mix> | Mix, RealMix = T extends Mix ? [T] : T > = RealMix extends [] ? { props: {} methods: {} emits: {} } : RealMix extends [infer First, ...infer Rest] ? Rest extends Array<Mix> ? { props: KeyType<First, 'props'> & KeyType<MultiMixin<Rest>, 'props'> methods: KeyType<First, 'methods'> & KeyType<MultiMixin<Rest>, 'methods'> emits: KeyType<First, 'emits'> & KeyType<MultiMixin<Rest>, 'emits'> } : never : never export type DropdownMixin = MultiMixin< [ { props: { overlayPriority?: number expanded?: boolean } }, OverlayMixin, ActivatableMixin, ControllableMixin<{ toggle(expanded: boolean): void }> ] > export type InputMixin = MultiMixin< [ { props: { name?: string readonly?: boolean disabled?: boolean invalid?: boolean } }, FocusableMixin ] > export type CarouselMixin = MultiMixin< [ { // props 要泛型 emits: { change(to: number, from: number): unknown } }, UiMixin ] >