Skip to content

Commit 08c5316

Browse files
authored
Merge pull request #13 from jsxiaosi/fix/type-check
fix(components): 🐛 table ts type error
2 parents faadedd + 53dd6fb commit 08c5316

File tree

6 files changed

+73
-50
lines changed

6 files changed

+73
-50
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@
133133
"vite-plugin-svg-icons": "^2.0.1",
134134
"vitest": "^2.1.8",
135135
"vue-eslint-parser": "^9.4.3",
136-
"vue-tsc": "^2.1.10",
136+
"vue-tsc": "^2.2.0",
137137
"xlsx": "^0.18.5"
138138
},
139139
"pnpm": {

pnpm-lock.yaml

Lines changed: 47 additions & 42 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/Table/index.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22
import { ElTable } from 'element-plus';
33
import type { TableProps } from 'element-plus';
44
import TableChild from './src/components/TableChild';
5-
import type { TableColumnProps } from './types/table';
5+
import type { TableColumnProps, TableSlotType } from './types/table';
66
77
const props = defineProps<TableProps<T> & { option: TableColumnProps<T>[] }>();
8+
9+
defineSlots<TableSlotType<T>>();
810
</script>
911

1012
<template>
1113
<div>
1214
<ElTable v-bind="{ ...props, ...$attrs }" :data="data" :border="border" fit show-header>
1315
<TableChild v-for="(item, index) in option" :key="index" :item="item">
14-
<template v-for="soitem in Object.keys($slots)" #[soitem]="data">
15-
<slot :name="soitem" v-bind="data" />
16+
<template v-for="slotsItem in Object.keys($slots)" #[slotsItem]="data">
17+
<slot :name="slotsItem" v-bind="data" />
1618
</template>
1719
</TableChild>
1820
</ElTable>

src/components/Table/src/components/TableChild.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { getSlot } from '@/utils/slotsHelper';
22
import { ElTableColumn } from 'element-plus';
33
import { defineComponent } from 'vue';
4-
import type { TableColumnCtx } from 'element-plus';
4+
import type { TableColumnInstance } from 'element-plus';
55
import type { SetupContext, VNode } from 'vue';
66
import type { TableColumnProps } from '../../types/table';
77

@@ -10,17 +10,18 @@ interface RenderType {
1010
header?: (scope: Recordable) => VNode[] | VNode | null;
1111
}
1212

13+
// TODO: header 存在children时,slots 无法渲染
1314
const TableChild = defineComponent(
1415
<T extends object = any>(props: { item: TableColumnProps<T> }, { slots }: SetupContext) => {
1516
const { item } = props;
1617

1718
function eLComponent(childrenRender: RenderType | null | undefined = null) {
1819
const { children, ...reItem } = item;
1920
if (childrenRender?.default) {
20-
return <ElTableColumn {...(reItem as TableColumnCtx<Recordable>)}>{childrenRender}</ElTableColumn>;
21+
return <ElTableColumn {...(reItem as TableColumnInstance)}>{childrenRender}</ElTableColumn>;
2122
} else {
2223
return (
23-
<ElTableColumn {...(reItem as TableColumnCtx<Recordable>)}>
24+
<ElTableColumn {...(reItem as TableColumnInstance)}>
2425
{childrenRender?.header}
2526
{children?.map(child => <TableChild item={child} />)}
2627
</ElTableColumn>

src/components/Table/types/table.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { TableColumnCtx } from 'element-plus';
1+
import type { RenderRowData, TableColumnCtx } from 'element-plus';
22

33
export interface TableColumnProps<T extends Recordable = Recordable>
44
extends Partial<Omit<TableColumnCtx<T>, 'prop' | 'children'>> {
@@ -8,3 +8,17 @@ export interface TableColumnProps<T extends Recordable = Recordable>
88
render_header?: (row: any) => JSX.Element;
99
children?: TableColumnProps<T>[];
1010
}
11+
12+
// export type TableSlotType<T extends object = object> = {
13+
// [key in keyof T as `${string & key}_header`]: (props: any) => void;
14+
// };
15+
16+
export type TableSlotType<T extends object = object> = {
17+
[key in keyof T]: (props: RenderRowData<T>) => void;
18+
} & {
19+
[key in keyof T as `${string & key}_header`]: (
20+
props: Omit<RenderRowData<T>, 'row' | 'treeNode' | 'expanded'> & {
21+
customItem: TableColumnProps<T>;
22+
},
23+
) => void;
24+
};

src/views/components/table-page/index.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
<span>表格</span>
128128
</div>
129129
</template>
130+
130131
<Table :data="tabList" border row-key="date" :option="option">
131132
<template #name_header="slotData">
132133
<span>{{ `插槽:${slotData.customItem.label}` }}</span>

0 commit comments

Comments
 (0)