如何在Vue3+TS+Element-Plus中正确封装ElTable为BaseTable并定义props类型?

今天使用vue3+ts+element-plus时候,准备基于ElTable封装一个通用的BaseTable,但是在写props类型的时候一直写不对,不知道错哪里了。
代码:

<script lang="ts" setup>
import { ElTable, type TableInstance } from "element-plus";

type ElTableProps = ExtractPublicPropTypes<TableInstance['$props']>
type BaseTableProps = {
  /**表头行高 */
  tableHeaderHeight?: number | string;
  /**行高 */
  columnHeight?: number | string;
  /**无数据文案 */
  emptyText?: string;
} & ElTableProps;
const props = defineProps<BaseTableProps>();
const tableRef = ref<TableInstance>();
</script>

写完后,vscode代码没红线,没提示错误
但是yarn dev后,进入到这个表格页面就会报错,如下:
image.png

搞了很久没搞通,有没有大佬知道是为什么,具体要怎么改,谢谢了

各个库的版本:
typescript: 5.6.3
vue: 3.5.13
element-plus: 2.9.0

用TableProps<any>作为接口继承来写倒是可以,但是写了any,是不是就会失去没行数据的类型呢?

之前旧的通用模板是能用的,但是ts、vue、elememt-plus这些都比较旧,现在准备升级一下就出现这个问题了。
当然,之前写的也是错的,不过编译器没报错,字段也没传错就一直不知道。直到今天才发现问题的,难瘦香菇

阅读 714
avatarAI BotBETA

在 Vue 3 + TypeScript + Element-Plus 中封装 ElTableBaseTable 并定义 props 类型时,需要确保你正确地使用了 Element-Plus 的类型定义,并且正确地继承了 ElTable 的 props。以下是一个可能的解决方案,包括如何定义 BaseTableProps 类型,并正确地使用 definePropsref

解决方案

  1. 正确导入 Element-Plus 类型
    确保你正确地从 Element-Plus 中导入了所需的类型。TableInstance 并不是 Element-Plus 公开的类型,你应该使用 ElTableProps 类型。
  2. 定义 BaseTableProps
    BaseTableProps 定义为包含自定义属性和 ElTable 的 props 的类型。
  3. 使用 defineProps
    在 Vue 3 中,defineProps 是通过 defineComponent 的参数来定义的,而不是直接调用。
  4. 使用 ref
    确保 tableRef 正确地引用了 ElTable 实例。

示例代码

<template>
  <el-table ref="tableRef" :data="data" v-bind="$attrs">
    <slot></slot>
  </el-table>
</template>

<script lang="ts">
import { defineComponent, ref, h } from 'vue';
import { ElTable } from 'element-plus';
import { ElTableProps } from 'element-plus/es/components/table/el-table';

type BaseTableProps = {
  /** 表头行高 */
  tableHeaderHeight?: number | string;
  /** 行高 */
  columnHeight?: number | string;
  /** 无数据文案 */
  emptyText?: string;
  /** ElTable 的 props */
} & ElTableProps;

export default defineComponent({
  name: 'BaseTable',
  props: {
    ...BaseTableProps,
  },
  setup(props, { attrs, slots }) {
    const tableRef = ref<InstanceType<typeof ElTable> | null>(null);

    // 你可以在这里添加额外的逻辑

    return {
      tableRef,
    };
  },
  render() {
    return h(ElTable, {
      ...this.$attrs,
      ref: 'tableRef',
      data: this.data, // 确保你有一个名为 data 的 prop 或从其他地方获取数据
    }, this.$slots.default());
  },
});
</script>

注意事项

  • 数据属性:确保你的 BaseTable 组件有一个 data 属性来传递给 ElTable,或者从其他地方获取数据。
  • 插槽:使用 <slot></slot> 传递任何子组件或列定义。
  • 类型安全:确保你的 props 传递给了 ElTable,并且正确地使用了 TypeScript 类型。

调试建议

  • 检查控制台错误:在浏览器中打开开发者工具,查看控制台是否有更详细的错误信息。
  • 确保 Element-Plus 版本:确保你使用的 Element-Plus 版本与 Vue 3 兼容。
  • TypeScript 配置:检查你的 tsconfig.json 是否正确配置了与 Vue 和 Element-Plus 兼容的选项。

通过遵循上述步骤和示例代码,你应该能够正确地封装 ElTableBaseTable 并定义 props 类型。

1 个回答

这不是很明显说ExtractPublicPropTypes这个类型没导入?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题