From c24509087b1193c18ee4c87487b0fc4bf8ee0918 Mon Sep 17 00:00:00 2001
From: Ben Lin <maobin001@msn.com>
Date: 星期一, 22 七月 2024 18:40:26 +0800
Subject: [PATCH] 工单更新

---
 src/components/Form/src/types/index.ts |  129 +++++++++++++++++++++++++++++++-----------
 1 files changed, 94 insertions(+), 35 deletions(-)

diff --git a/src/components/Form/src/types/index.ts b/src/components/Form/src/types/index.ts
index 294b080..50d1400 100644
--- a/src/components/Form/src/types/index.ts
+++ b/src/components/Form/src/types/index.ts
@@ -1,3 +1,5 @@
+import type { Component, VNodeProps } from 'vue';
+
 type ColSpanType = number | string;
 export interface ColEx {
   style?: any;
@@ -80,38 +82,95 @@
   xxl?: { span: ColSpanType; offset: ColSpanType } | ColSpanType;
 }
 
-export type ComponentType =
-  | 'Input'
-  | 'InputGroup'
-  | 'InputPassword'
-  | 'InputSearch'
-  | 'InputTextArea'
-  | 'InputNumber'
-  | 'InputCountDown'
-  | 'Select'
-  | 'ApiSelect'
-  | 'TreeSelect'
-  | 'ApiTree'
-  | 'ApiTreeSelect'
-  | 'ApiRadioGroup'
-  | 'RadioButtonGroup'
-  | 'RadioGroup'
-  | 'Checkbox'
-  | 'CheckboxGroup'
-  | 'AutoComplete'
-  | 'ApiCascader'
-  | 'Cascader'
-  | 'DatePicker'
-  | 'MonthPicker'
-  | 'RangePicker'
-  | 'WeekPicker'
-  | 'TimePicker'
-  | 'Switch'
-  | 'StrengthMeter'
-  | 'Upload'
-  | 'IconPicker'
-  | 'Render'
-  | 'Slider'
-  | 'Rate'
-  | 'Divider'
-  | 'ApiTransfer';
+export type ComponentType = keyof ComponentProps;
+
+type MethodsNameToCamelCase<
+  T extends string,
+  M extends string = '',
+> = T extends `${infer F}-${infer N}${infer Tail}`
+  ? MethodsNameToCamelCase<Tail, `${M}${F}${Uppercase<N>}`>
+  : `${M}${T}`;
+
+type MethodsNameTransform<T> = {
+  [K in keyof T as K extends `on${string}` ? MethodsNameToCamelCase<K> : never]: T[K];
+};
+
+type ExtractPropTypes<T extends Component> = T extends new (...args: any) => any
+  ? Omit<InstanceType<T>['$props'], keyof VNodeProps>
+  : never;
+
+interface _CustomComponents {
+  ApiSelect: ExtractPropTypes<(typeof import('../components/ApiSelect.vue'))['default']>;
+  ApiTree: ExtractPropTypes<(typeof import('../components/ApiTree.vue'))['default']>;
+  ApiTreeSelect: ExtractPropTypes<(typeof import('../components/ApiTreeSelect.vue'))['default']>;
+  ApiRadioGroup: ExtractPropTypes<(typeof import('../components/ApiRadioGroup.vue'))['default']>;
+  RadioButtonGroup: ExtractPropTypes<
+    (typeof import('../components/RadioButtonGroup.vue'))['default']
+  >;
+  ApiCascader: ExtractPropTypes<(typeof import('../components/ApiCascader.vue'))['default']>;
+  StrengthMeter: ExtractPropTypes<
+    (typeof import('@/components/StrengthMeter/src/StrengthMeter.vue'))['default']
+  >;
+  Upload: ExtractPropTypes<(typeof import('@/components/Upload/src/BasicUpload.vue'))['default']>;
+  ImageUpload: ExtractPropTypes<
+    (typeof import('@/components/Upload/src/components/ImageUpload.vue'))['default']
+  >;
+  IconPicker: ExtractPropTypes<(typeof import('@/components/Icon/src/IconPicker.vue'))['default']>;
+  ApiTransfer: ExtractPropTypes<(typeof import('../components/ApiTransfer.vue'))['default']>;
+  CropperAvatar: ExtractPropTypes<
+    (typeof import('@/components/Cropper/src/CropperAvatar.vue'))['default']
+  >;
+  BasicTitle: ExtractPropTypes<(typeof import('@/components/Basic/src/BasicTitle.vue'))['default']>;
+  InputCountDown: ExtractPropTypes<
+    (typeof import('@/components/CountDown/src/CountdownInput.vue'))['default']
+  >;
+}
+
+type CustomComponents<T = _CustomComponents> = {
+  [K in keyof T]: T[K] & MethodsNameTransform<T[K]>;
+};
+
+export interface ComponentProps {
+  Input: ExtractPropTypes<(typeof import('ant-design-vue/es/input'))['default']>;
+  InputGroup: ExtractPropTypes<(typeof import('ant-design-vue/es/input'))['InputGroup']>;
+  InputPassword: ExtractPropTypes<(typeof import('ant-design-vue/es/input'))['InputPassword']>;
+  InputSearch: ExtractPropTypes<(typeof import('ant-design-vue/es/input'))['InputSearch']>;
+  InputTextArea: ExtractPropTypes<(typeof import('ant-design-vue/es/input'))['Textarea']>;
+  InputNumber: ExtractPropTypes<(typeof import('ant-design-vue/es/input-number'))['default']>;
+  InputCountDown: CustomComponents['InputCountDown'] & ComponentProps['Input'];
+  Select: ExtractPropTypes<(typeof import('ant-design-vue/es/select'))['default']>;
+  ApiSelect: CustomComponents['ApiSelect'] & ComponentProps['Select'];
+  TreeSelect: ExtractPropTypes<(typeof import('ant-design-vue/es/tree-select'))['default']>;
+  ApiTree: CustomComponents['ApiTree'] &
+    ExtractPropTypes<(typeof import('ant-design-vue/es/tree'))['default']>;
+  ApiTreeSelect: CustomComponents['ApiTreeSelect'] & ComponentProps['TreeSelect'];
+  ApiRadioGroup: CustomComponents['ApiRadioGroup'] & ComponentProps['RadioGroup'];
+  RadioButtonGroup: CustomComponents['RadioButtonGroup'] & ComponentProps['RadioGroup'];
+  RadioGroup: ExtractPropTypes<(typeof import('ant-design-vue/es/radio'))['RadioGroup']>;
+  Checkbox: ExtractPropTypes<(typeof import('ant-design-vue/es/checkbox'))['default']>;
+  CheckboxGroup: ExtractPropTypes<(typeof import('ant-design-vue/es/checkbox'))['CheckboxGroup']>;
+  AutoComplete: ExtractPropTypes<(typeof import('ant-design-vue/es/auto-complete'))['default']>;
+  ApiCascader: CustomComponents['ApiCascader'] & ComponentProps['Cascader'];
+  Cascader: ExtractPropTypes<(typeof import('ant-design-vue/es/cascader'))['default']>;
+  DatePicker: ExtractPropTypes<(typeof import('ant-design-vue/es/date-picker'))['default']>;
+  MonthPicker: ExtractPropTypes<(typeof import('ant-design-vue/es/date-picker'))['MonthPicker']>;
+  RangePicker: ExtractPropTypes<(typeof import('ant-design-vue/es/date-picker'))['RangePicker']>;
+  WeekPicker: ExtractPropTypes<(typeof import('ant-design-vue/es/date-picker'))['WeekPicker']>;
+  TimePicker: ExtractPropTypes<(typeof import('ant-design-vue/es/time-picker'))['TimePicker']>;
+  TimeRangePicker: ExtractPropTypes<
+    (typeof import('ant-design-vue/es/time-picker'))['TimeRangePicker']
+  >;
+  Switch: ExtractPropTypes<(typeof import('ant-design-vue/es/switch'))['default']>;
+  StrengthMeter: CustomComponents['StrengthMeter'] & ComponentProps['InputPassword'];
+  Upload: CustomComponents['Upload'];
+  ImageUpload: CustomComponents['ImageUpload'];
+  IconPicker: CustomComponents['IconPicker'];
+  Render: Record<string, any>;
+  Slider: ExtractPropTypes<(typeof import('ant-design-vue/es/slider'))['default']>;
+  Rate: ExtractPropTypes<(typeof import('ant-design-vue/es/rate'))['default']>;
+  Divider: ExtractPropTypes<(typeof import('ant-design-vue/es/divider'))['default']>;
+  ApiTransfer: CustomComponents['ApiTransfer'] & ComponentProps['Transfer'];
+  Transfer: ExtractPropTypes<(typeof import('ant-design-vue/es/transfer'))['default']>;
+  CropperAvatar: CustomComponents['CropperAvatar'];
+  BasicTitle: CustomComponents['BasicTitle'];
+}

--
Gitblit v1.9.3