Commit a98835e18b441ce9e6e5b035ea9aa08c91f6a101
1 parent
5b4a41ce
chore: types
Showing
15 changed files
with
122 additions
and
255 deletions
src/components/Form/src/components/ApiSelect copy.vue deleted
100644 → 0
1 | -<template> | |
2 | - <Select v-bind="attrs" :options="getOptions" v-model:value="state" @focus="handleFetch"> | |
3 | - <template #[item]="data" v-for="item in Object.keys($slots)"> | |
4 | - <slot :name="item" v-bind="data"></slot> | |
5 | - </template> | |
6 | - <template #suffixIcon v-if="loading"> | |
7 | - <LoadingOutlined spin /> | |
8 | - </template> | |
9 | - <template #notFoundContent v-if="loading"> | |
10 | - <span> | |
11 | - <LoadingOutlined spin class="mr-1" /> | |
12 | - {{ t('component.form.apiSelectNotFound') }} | |
13 | - </span> | |
14 | - </template> | |
15 | - </Select> | |
16 | -</template> | |
17 | -<script lang="ts"> | |
18 | - import { defineComponent, PropType, ref, watchEffect, computed, unref } from 'vue'; | |
19 | - import { Select } from 'ant-design-vue'; | |
20 | - import { isFunction } from '/@/utils/is'; | |
21 | - import { useRuleFormItem } from '/@/hooks/component/useFormItem'; | |
22 | - import { useAttrs } from '/@/hooks/core/useAttrs'; | |
23 | - import { get } from 'lodash-es'; | |
24 | - | |
25 | - import { LoadingOutlined } from '@ant-design/icons-vue'; | |
26 | - import { useI18n } from '/@/hooks/web/useI18n'; | |
27 | - import { propTypes } from '/@/utils/propTypes'; | |
28 | - | |
29 | - type OptionsItem = { label: string; value: string; disabled?: boolean }; | |
30 | - | |
31 | - export default defineComponent({ | |
32 | - name: 'ApiSelect', | |
33 | - components: { | |
34 | - Select, | |
35 | - LoadingOutlined, | |
36 | - }, | |
37 | - inheritAttrs: false, | |
38 | - props: { | |
39 | - value: propTypes.string, | |
40 | - numberToString: propTypes.bool, | |
41 | - api: { | |
42 | - type: Function as PropType<(arg?: Recordable) => Promise<OptionsItem[]>>, | |
43 | - default: null, | |
44 | - }, | |
45 | - // api params | |
46 | - params: { | |
47 | - type: Object as PropType<Recordable>, | |
48 | - default: () => {}, | |
49 | - }, | |
50 | - // support xxx.xxx.xx | |
51 | - resultField: propTypes.string.def(''), | |
52 | - labelField: propTypes.string.def('label'), | |
53 | - valueField: propTypes.string.def('value'), | |
54 | - immediate: propTypes.bool.def(true), | |
55 | - }, | |
56 | - emits: ['options-change', 'change'], | |
57 | - setup(props, { emit }) { | |
58 | - const options = ref<OptionsItem[]>([]); | |
59 | - const loading = ref(false); | |
60 | - const isFirstLoad = ref(true); | |
61 | - const attrs = useAttrs(); | |
62 | - const { t } = useI18n(); | |
63 | - | |
64 | - // Embedded in the form, just use the hook binding to perform form verification | |
65 | - const [state] = useRuleFormItem(props); | |
66 | - | |
67 | - const getOptions = computed(() => { | |
68 | - const { labelField, valueField, numberToString } = props; | |
69 | - | |
70 | - return unref(options).reduce((prev, next: Recordable) => { | |
71 | - if (next) { | |
72 | - const value = next[valueField]; | |
73 | - prev.push({ | |
74 | - label: next[labelField], | |
75 | - value: numberToString ? `${value}` : value, | |
76 | - }); | |
77 | - } | |
78 | - return prev; | |
79 | - }, [] as OptionsItem[]); | |
80 | - }); | |
81 | - | |
82 | - watchEffect(() => { | |
83 | - if (isFirstLoad.value) { | |
84 | - props.immediate && fetch(); | |
85 | - } else { | |
86 | - fetch(); | |
87 | - } | |
88 | - }); | |
89 | - | |
90 | - async function fetch() { | |
91 | - const api = props.api; | |
92 | - if (!api || !isFunction(api)) return; | |
93 | - | |
94 | - try { | |
95 | - loading.value = true; | |
96 | - const res = await api(props.params); | |
97 | - if (Array.isArray(res)) { | |
98 | - options.value = res; | |
99 | - emitChange(); | |
100 | - return; | |
101 | - } | |
102 | - if (props.resultField) { | |
103 | - options.value = get(res, props.resultField) || []; | |
104 | - } | |
105 | - emitChange(); | |
106 | - } catch (error) { | |
107 | - console.warn(error); | |
108 | - } finally { | |
109 | - loading.value = false; | |
110 | - } | |
111 | - } | |
112 | - | |
113 | - async function handleFetch() { | |
114 | - if (!props.immediate) { | |
115 | - await fetch(); | |
116 | - } | |
117 | - isFirstLoad.value = false; | |
118 | - } | |
119 | - | |
120 | - function emitChange() { | |
121 | - emit('options-change', unref(options)); | |
122 | - } | |
123 | - | |
124 | - return { state, attrs, getOptions, loading, t, handleFetch }; | |
125 | - }, | |
126 | - }); | |
127 | -</script> |
src/components/Scrollbar/src/bar.ts
... | ... | @@ -28,7 +28,7 @@ export default defineComponent({ |
28 | 28 | const bar = computed(() => { |
29 | 29 | return BAR_MAP[props.vertical ? 'vertical' : 'horizontal']; |
30 | 30 | }); |
31 | - const barStore = ref<Indexable>({}); | |
31 | + const barStore = ref<Recordable>({}); | |
32 | 32 | const cursorDown = ref<any>(null); |
33 | 33 | const clickThumbHandler = (e: any) => { |
34 | 34 | // prevent click event of right button | ... | ... |
src/components/Table/src/components/editable/index.ts
... | ... | @@ -41,7 +41,7 @@ export function renderEditCell(column: BasicColumn) { |
41 | 41 | }; |
42 | 42 | } |
43 | 43 | |
44 | -export type EditRecordRow<T = Hash<any>> = Partial< | |
44 | +export type EditRecordRow<T = Recordable> = Partial< | |
45 | 45 | { |
46 | 46 | onEdit: (editable: boolean, submit?: boolean) => Promise<boolean>; |
47 | 47 | editable: boolean; | ... | ... |
src/components/Table/src/types/table.ts
... | ... | @@ -402,7 +402,7 @@ export interface BasicColumn extends ColumnProps { |
402 | 402 | flag?: 'INDEX' | 'DEFAULT' | 'CHECKBOX' | 'RADIO' | 'ACTION'; |
403 | 403 | customTitle?: VueNode; |
404 | 404 | |
405 | - slots?: Indexable; | |
405 | + slots?: Recordable; | |
406 | 406 | |
407 | 407 | // Whether to hide the column by default, it can be displayed in the column configuration |
408 | 408 | defaultHidden?: boolean; | ... | ... |
src/directives/ripple/index.ts
... | ... | @@ -181,7 +181,7 @@ function rippler({ |
181 | 181 | }; |
182 | 182 | } |
183 | 183 | |
184 | -function setProps(modifiers: Hash<any>, props: Recordable) { | |
184 | +function setProps(modifiers: Recordable, props: Recordable) { | |
185 | 185 | modifiers.forEach((item: Recordable) => { |
186 | 186 | if (isNaN(Number(item))) props.event = item; |
187 | 187 | else props.transition = item; | ... | ... |
src/hooks/component/useFormItem.ts
... | ... | @@ -3,7 +3,7 @@ import { reactive, readonly, computed, getCurrentInstance, watchEffect } from 'v |
3 | 3 | |
4 | 4 | import { isEqual } from 'lodash-es'; |
5 | 5 | |
6 | -export function useRuleFormItem<T extends Indexable>( | |
6 | +export function useRuleFormItem<T extends Recordable>( | |
7 | 7 | props: T, |
8 | 8 | key: keyof T = 'value', |
9 | 9 | changeEvent = 'change' | ... | ... |
src/layouts/page/transition.ts
... | ... | @@ -2,7 +2,7 @@ import type { FunctionalComponent } from 'vue'; |
2 | 2 | import type { RouteLocation } from 'vue-router'; |
3 | 3 | |
4 | 4 | export interface DefaultContext { |
5 | - Component: FunctionalComponent & { type: Indexable }; | |
5 | + Component: FunctionalComponent & { type: Recordable }; | |
6 | 6 | route: RouteLocation; |
7 | 7 | } |
8 | 8 | ... | ... |
src/router/guard/permissionGuard.ts
... | ... | @@ -38,7 +38,7 @@ export function createPermissionGuard(router: Router) { |
38 | 38 | return; |
39 | 39 | } |
40 | 40 | // redirect login page |
41 | - const redirectData: { path: string; replace: boolean; query?: Indexable<string> } = { | |
41 | + const redirectData: { path: string; replace: boolean; query?: Recordable<string> } = { | |
42 | 42 | path: LOGIN_PATH, |
43 | 43 | replace: true, |
44 | 44 | }; | ... | ... |
src/utils/http/axios/types.ts
... | ... | @@ -28,7 +28,7 @@ export interface Result<T = any> { |
28 | 28 | // multipart/form-data: upload file |
29 | 29 | export interface UploadFileParams { |
30 | 30 | // Other parameters |
31 | - data?: Indexable; | |
31 | + data?: Recordable; | |
32 | 32 | // File parameter interface field name |
33 | 33 | name?: string; |
34 | 34 | // file name | ... | ... |
types/global.d.ts
1 | -declare interface Fn<T = any, R = T> { | |
2 | - (...arg: T[]): R; | |
1 | +import type { | |
2 | + App, | |
3 | + ComponentRenderProxy, | |
4 | + VNode, | |
5 | + ComponentPublicInstance, | |
6 | + FunctionalComponent, | |
7 | +} from 'vue'; | |
8 | +declare global { | |
9 | + declare interface Window { | |
10 | + // Global vue app instance | |
11 | + __APP__: App<Element>; | |
12 | + } | |
13 | + | |
14 | + export type Writable<T> = { | |
15 | + -readonly [P in keyof T]: T[P]; | |
16 | + }; | |
17 | + | |
18 | + declare type Nullable<T> = T | null; | |
19 | + declare type NonNullable<T> = T extends null | undefined ? never : T; | |
20 | + declare type Recordable<T = any> = Record<string, T>; | |
21 | + declare type ReadonlyRecordable<T = any> = { | |
22 | + readonly [key: string]: T; | |
23 | + }; | |
24 | + declare type Indexable<T = any> = { | |
25 | + [key: string]: T; | |
26 | + }; | |
27 | + declare type DeepPartial<T> = { | |
28 | + [P in keyof T]?: DeepPartial<T[P]>; | |
29 | + }; | |
30 | + declare type TimeoutHandle = ReturnType<typeof setTimeout>; | |
31 | + declare type IntervalHandle = ReturnType<typeof setInterval>; | |
32 | + | |
33 | + declare interface ChangeEvent extends Event { | |
34 | + target: HTMLInputElement; | |
35 | + } | |
36 | + | |
37 | + declare interface WheelEvent { | |
38 | + path?: EventTarget[]; | |
39 | + } | |
40 | + interface ImportMetaEnv extends ViteEnv { | |
41 | + __: unknown; | |
42 | + } | |
43 | + | |
44 | + declare interface ViteEnv { | |
45 | + VITE_PORT: number; | |
46 | + VITE_USE_MOCK: boolean; | |
47 | + VITE_USE_PWA: boolean; | |
48 | + VITE_PUBLIC_PATH: string; | |
49 | + VITE_PROXY: [string, string][]; | |
50 | + VITE_GLOB_APP_TITLE: string; | |
51 | + VITE_GLOB_APP_SHORT_NAME: string; | |
52 | + VITE_USE_CDN: boolean; | |
53 | + VITE_DROP_CONSOLE: boolean; | |
54 | + VITE_BUILD_COMPRESS: 'gzip' | 'brotli' | 'none'; | |
55 | + VITE_LEGACY: boolean; | |
56 | + VITE_USE_IMAGEMIN: boolean; | |
57 | + VITE_GENERATE_UI: string; | |
58 | + } | |
59 | + | |
60 | + declare function parseInt(s: string | number, radix?: number): number; | |
61 | + | |
62 | + declare function parseFloat(string: string | number): number; | |
63 | + | |
64 | + namespace JSX { | |
65 | + // tslint:disable no-empty-interface | |
66 | + type Element = VNode; | |
67 | + // tslint:disable no-empty-interface | |
68 | + type ElementClass = ComponentRenderProxy; | |
69 | + interface ElementAttributesProperty { | |
70 | + $props: any; | |
71 | + } | |
72 | + interface IntrinsicElements { | |
73 | + [elem: string]: any; | |
74 | + } | |
75 | + interface IntrinsicAttributes { | |
76 | + [elem: string]: any; | |
77 | + } | |
78 | + } | |
3 | 79 | } |
4 | 80 | |
5 | -declare interface PromiseFn<T = any, R = T> { | |
6 | - (...arg: T[]): Promise<R>; | |
7 | -} | |
8 | - | |
9 | -declare interface IObj<T = any> { | |
10 | - [key: string]: T; | |
11 | - [key: number]: T; | |
12 | -} | |
13 | - | |
14 | -declare function parseInt(s: string | number, radix?: number): number; | |
15 | - | |
16 | -declare function parseFloat(string: string | number): number; | |
17 | - | |
18 | -declare type Nullable<T> = T | null; | |
19 | - | |
20 | -declare type NonNullable<T> = T extends null | undefined ? never : T; | |
21 | - | |
22 | -declare type RefType<T> = T | null; | |
23 | - | |
24 | -declare type CustomizedHTMLElement<T> = HTMLElement & T; | |
25 | - | |
26 | -declare type Indexable<T extends any = any> = { | |
27 | - [key: string]: T; | |
28 | -}; | |
29 | - | |
30 | -declare type Recordable<T extends any = any> = Record<string, T>; | |
31 | - | |
32 | -declare type ReadonlyRecordable<T extends any = any> = { | |
33 | - readonly [key: string]: T; | |
34 | -}; | |
35 | - | |
36 | -declare type Hash<T> = Indexable<T>; | |
37 | - | |
38 | -declare type DeepPartial<T> = { | |
39 | - [P in keyof T]?: DeepPartial<T[P]>; | |
40 | -}; | |
41 | - | |
42 | -declare type LabelValueOptions = { | |
43 | - label: string; | |
44 | - value: any; | |
45 | -}[]; | |
46 | - | |
47 | -declare type EmitType = (event: string, ...args: any[]) => void; | |
48 | - | |
49 | -declare type TargetContext = '_self' | '_blank'; | |
50 | - | |
51 | -declare type TimeoutHandle = ReturnType<typeof setTimeout>; | |
52 | - | |
53 | -declare type IntervalHandle = ReturnType<typeof setInterval>; | |
54 | - | |
55 | -declare interface ComponentElRef<T extends HTMLElement = HTMLDivElement> { | |
56 | - $el: T; | |
57 | -} | |
58 | - | |
59 | -declare type ComponentRef<T extends HTMLElement = HTMLDivElement> = ComponentElRef<T> | null; | |
60 | - | |
61 | -declare type ElRef<T extends HTMLElement = HTMLDivElement> = Nullable<T>; | |
62 | - | |
63 | -type IsSame<A, B> = A | B extends A & B ? true : false; | |
64 | - | |
65 | -declare interface ChangeEvent extends Event { | |
66 | - target: HTMLInputElement; | |
67 | -} | |
68 | - | |
69 | -declare interface WheelEvent { | |
70 | - path?: EventTarget[]; | |
71 | -} | |
72 | - | |
73 | -interface ImportMetaEnv extends ViteEnv { | |
74 | - __: unknown; | |
75 | -} | |
76 | - | |
77 | -declare interface ViteEnv { | |
78 | - VITE_PORT: number; | |
79 | - VITE_USE_MOCK: boolean; | |
80 | - VITE_USE_PWA: boolean; | |
81 | - VITE_PUBLIC_PATH: string; | |
82 | - VITE_PROXY: [string, string][]; | |
83 | - VITE_GLOB_APP_TITLE: string; | |
84 | - VITE_GLOB_APP_SHORT_NAME: string; | |
85 | - VITE_USE_CDN: boolean; | |
86 | - VITE_DROP_CONSOLE: boolean; | |
87 | - VITE_BUILD_COMPRESS: 'gzip' | 'brotli' | 'none'; | |
88 | - VITE_LEGACY: boolean; | |
89 | - VITE_USE_IMAGEMIN: boolean; | |
90 | - VITE_GENERATE_UI: string; | |
81 | +declare module 'vue' { | |
82 | + export type JSXComponent<Props = any> = | |
83 | + | { new (): ComponentPublicInstance<Props> } | |
84 | + | FunctionalComponent<Props>; | |
91 | 85 | } | ... | ... |
types/index.d.ts
0 → 100644
1 | +declare interface Fn<T = any, R = T> { | |
2 | + (...arg: T[]): R; | |
3 | +} | |
4 | + | |
5 | +declare interface PromiseFn<T = any, R = T> { | |
6 | + (...arg: T[]): Promise<R>; | |
7 | +} | |
8 | + | |
9 | +declare type RefType<T> = T | null; | |
10 | + | |
11 | +declare type LabelValueOptions = { | |
12 | + label: string; | |
13 | + value: any; | |
14 | +}[]; | |
15 | + | |
16 | +declare type EmitType = (event: string, ...args: any[]) => void; | |
17 | + | |
18 | +declare type TargetContext = '_self' | '_blank'; | |
19 | + | |
20 | +declare interface ComponentElRef<T extends HTMLElement = HTMLDivElement> { | |
21 | + $el: T; | |
22 | +} | |
23 | + | |
24 | +declare type ComponentRef<T extends HTMLElement = HTMLDivElement> = ComponentElRef<T> | null; | |
25 | + | |
26 | +declare type ElRef<T extends HTMLElement = HTMLDivElement> = Nullable<T>; | ... | ... |
types/module.d.ts
1 | +declare module '*.vue' { | |
2 | + import { defineComponent } from 'vue'; | |
3 | + const Component: ReturnType<typeof defineComponent>; | |
4 | + export default Component; | |
5 | +} | |
6 | + | |
1 | 7 | declare module 'ant-design-vue/es/locale/*' { |
2 | 8 | import { Locale } from 'ant-design-vue/types/locale-provider'; |
3 | 9 | const locale: Locale & ReadonlyRecordable; | ... | ... |
types/tsx.d.ts deleted
100644 → 0
1 | -import type { ComponentRenderProxy, VNode } from 'vue'; | |
2 | - | |
3 | -declare global { | |
4 | - namespace JSX { | |
5 | - // tslint:disable no-empty-interface | |
6 | - type Element = VNode; | |
7 | - // tslint:disable no-empty-interface | |
8 | - type ElementClass = ComponentRenderProxy; | |
9 | - interface ElementAttributesProperty { | |
10 | - $props: any; | |
11 | - } | |
12 | - interface IntrinsicElements { | |
13 | - [elem: string]: any; | |
14 | - } | |
15 | - interface IntrinsicAttributes { | |
16 | - [elem: string]: any; | |
17 | - } | |
18 | - } | |
19 | -} |
types/vue-app-env.d.ts deleted
100644 → 0