From 6d465b17a83872e64c9ec07990b9e069d030643b Mon Sep 17 00:00:00 2001 From: neverland Date: Wed, 10 Feb 2021 22:33:57 +0800 Subject: [PATCH] types(TreeSelect): use tsx (#8126) --- src/tree-select/{index.js => index.tsx} | 35 ++++++++++++++++++------- src/vue-shim.d.ts | 7 +++-- 2 files changed, 31 insertions(+), 11 deletions(-) rename src/tree-select/{index.js => index.tsx} (80%) diff --git a/src/tree-select/index.js b/src/tree-select/index.tsx similarity index 80% rename from src/tree-select/index.js rename to src/tree-select/index.tsx index a0d5c7e25..e9655a670 100644 --- a/src/tree-select/index.js +++ b/src/tree-select/index.tsx @@ -1,3 +1,5 @@ +import { PropType } from 'vue'; + // Utils import { createNamespace, addUnit } from '../utils'; @@ -8,6 +10,21 @@ import SidebarItem from '../sidebar-item'; const [createComponent, bem] = createNamespace('tree-select'); +export type TreeSelectChild = { + id: number | string; + text: string; + disabled?: boolean; +}; + +export type TreeSelectItem = { + dot?: boolean; + text: string; + badge?: number | string; + children?: TreeSelectChild[]; + disabled?: boolean; + className?: any; +}; + export default createComponent({ props: { max: { @@ -15,7 +32,7 @@ export default createComponent({ default: Infinity, }, items: { - type: Array, + type: Array as PropType, default: () => [], }, height: { @@ -23,7 +40,9 @@ export default createComponent({ default: 300, }, activeId: { - type: [Number, String, Array], + type: [Number, String, Array] as PropType< + number | string | Array + >, default: 0, }, selectedIcon: { @@ -44,22 +63,20 @@ export default createComponent({ ], setup(props, { emit, slots }) { - const isMultiple = () => Array.isArray(props.activeId); - - const isActiveItem = (id) => { - return isMultiple() + const isActiveItem = (id: number | string) => { + return Array.isArray(props.activeId) ? props.activeId.indexOf(id) !== -1 : props.activeId === id; }; - const renderSubItem = (item) => { + const renderSubItem = (item: TreeSelectChild) => { const onClick = () => { if (item.disabled) { return; } let activeId; - if (isMultiple()) { + if (Array.isArray(props.activeId)) { activeId = props.activeId.slice(); const index = activeId.indexOf(item.id); @@ -97,7 +114,7 @@ export default createComponent({ ); }; - const onSidebarChange = (index) => { + const onSidebarChange = (index: number) => { emit('update:mainActiveIndex', index); emit('click-nav', index); }; diff --git a/src/vue-shim.d.ts b/src/vue-shim.d.ts index c384c0dc8..0a7a2f639 100644 --- a/src/vue-shim.d.ts +++ b/src/vue-shim.d.ts @@ -1,5 +1,7 @@ import 'vue'; +type EventHandler = (...args: any[]) => void; + // TODO // should be removed after Vue supported component events typing // see: https://github.com/vuejs/vue-next/issues/1553 @@ -8,7 +10,8 @@ declare module 'vue' { interface ComponentCustomProps { role?: string; tabindex?: number; - onClick?: (event: MouseEvent) => void; - onClosed?: () => void; + onClick?: EventHandler; + onClosed?: EventHandler; + onChange?: EventHandler; } }