import type { ComponentProps, ComponentExposed } from 'vue-component-type-helpers'; import type { DirectiveArguments, ComponentPublicInstance, Ref } from 'vue'; import type { ElCascader, ElDatePicker, ElInputNumber, ElTimePicker, ElTimeSelect, ElSwitch, ElAutocomplete, ElInput, ElSelect, ElCheckboxGroup, ElRadioGroup, FormItemRule, FormItemProps, FormInstance as ElFormInstance } from 'element-plus'; import type { FormProps } from '../form-props'; type ExtractEvents = { [K in keyof T as K extends `on${string}` ? K : never]: T[K]; }; export interface FormComponentRegistry { 'el-cascader': typeof ElCascader; 'el-date-picker': typeof ElDatePicker; 'el-input-number': typeof ElInputNumber; 'el-time-picker': typeof ElTimePicker; 'el-time-select': typeof ElTimeSelect; 'el-switch': typeof ElSwitch; 'el-autocomplete': typeof ElAutocomplete; 'el-input': typeof ElInput; 'el-select': typeof ElSelect; 'el-checkbox-group': typeof ElCheckboxGroup; 'el-radio-group': typeof ElRadioGroup; } export type FormFieldItemType = keyof FormComponentRegistry | 'text' | 'slot'; export type FormFieldItemTypeRegistry = { [K in FormFieldItemType]: K extends keyof FormComponentRegistry ? ComponentProps : Record; }; type ComponentInstanceRegistry = { [K in FormFieldItemType]: K extends keyof FormComponentRegistry ? ComponentPublicInstance> & ComponentExposed : ComponentPublicInstance; }; export interface FormFieldItem { hidden?: boolean; if?: boolean; show?: boolean; prop?: string; label?: string; type: T; formItemProps?: Partial; props?: T extends keyof FormFieldItemTypeRegistry ? Partial : Record; readonly?: boolean; events?: T extends keyof FormFieldItemTypeRegistry ? Partial> : Record; directives?: DirectiveArguments; rules?: FormItemRule | FormItemRule[]; textFormatter?(value: any): any; colProps?: Record; slot?: string; config?: { labelKey?: string; valueKey?: string; disabledKey?: string; bindObject?: boolean; options?: Record[]; group?: boolean; trim?: boolean; }; ref?: (ref: T extends keyof ComponentInstanceRegistry ? ComponentInstanceRegistry[T] | null : ComponentPublicInstance | null) => void; } export type ComponentsConfig = { [key in FormFieldItemType]?: ComponentConfig; }; export interface ComponentConfig { component: any; defaultProps?(field: FormFieldItem, config: FormFieldItem['config'] & { labelKey: string; valueKey: string; disabledKey: string; }): Record; defaultConfig?(field: FormFieldItem): FormFieldItem['config']; defaultValue?(field: FormFieldItem): any; } export interface FormExpose { elFormCtx: Ref; } export type FormInstance = ComponentPublicInstance; export {};