SSF0SSF0
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
  • HTML

    • html1
    • html2
  • CSS

    • Flex 布局常见问题与解决方案
  • JavaScript

    • 数据类型及引用问题
    • 处理 Blob 类型文件下载问题总结
    • localStorage 与 sessionStorage 区别
    • JavaScript 中的 script 标签问题详解
    • JavaScript 中的`this`指向问题详解
    • SessionStorage踩坑记录:它真的能"只设置一次"吗?
    • 动态加载 JS 脚本方法对比
    • 浏览器页面关闭场景下的数据上报
  • es6

    • Promise
    • es6 模块导出方式全解析
  • Vue2

    • created VS mounted 发起异步请求
    • vue2-2
  • Vue3

    • Vite + Vue3 修改 element-plus 源码
    • Vue v-if 与 v-show
    • Vue3 ref 获取组件
    • Vue3 路由传参
    • 父子组件与组件里 Hooks 加载顺序
    • 第三方组件传入参数TS提示
    • Vue3 Props 在 Hooks 中的响应性处理
    • Vue Router 的两种历史模式及部署配置详解
    • 在Vue 3项目中顺利集成Tailwind CSS的完整指南
    • Vue 3 深度选择器:deep()完全指南
  • Electron

    • 快速构建 electron + vue3 项目
  • TS

    • TS 泛型
    • 记录模板使用断言的问题
    • type 与 interface
  • WebPack

    • Webpack 介绍
  • Vite

    • Vite CLI 常见命令
    • vite 与 webpack 比较
  • 项目工程

    • 前端代码风格
    • Vue3 项目规范
    • npm 镜像问题
    • 包管理工具
    • 使用 engines 限制开发环境依赖
    • 打包与shell交互指定模式
    • 使用 pnpm 构建 Monorepo 实战指南
    • pnpm 修改依赖源码打包报错
  • 记录一下小程序
  • 控制浏览器正确保存网站账号密码的技巧

Element Plus 组件 TypeScript 类型校验问题

问题描述

在使用 Element Plus 的 el-option 组件时,发现传入未定义的 prop :values 没有得到 TypeScript 的类型校验提示。

<el-option :value="item.value" :label="item.label" :values="item.value" />
<!--  这里的 values 属性在SelectOptionProxy接口中并未定义 -->

原因分析

  1. Vue 3 模板中的类型检查机制相对宽松

  2. 默认情况下,Vue 允许向组件传递"额外"的 props

  3. TypeScript 主要针对 .ts/.tsx 文件进行类型检查,Vue 模板需要额外配置

解决方案

1. 开启严格模板类型检查

在 tsconfig.json 中添加:

{
  "vueCompilerOptions": {
    "strictTemplates": true
  }
}

2. 使用 defineProps 显式声明类型

const props = defineProps<{
  value: string | number;
  label: string | number;
  // ... 其他属性
}>();

3. 配置 ESLint

安装并配置 ESLint 的 Vue 插件:

// .eslintrc.js
module.exports = {
  plugins: ["vue"],
  rules: {
    "vue/no-unused-properties": [
      "error",
      {
        groups: ["props", "data", "computed", "methods"],
      },
    ],
  },
};

最佳实践

  1. 严格遵循组件的类型定义

  2. 移除未定义的属性(如本例中的 :values)

  3. 开启严格的类型检查配置

  4. 使用 IDE 插件辅助开发(如 Volar)

相关接口定义

Element Plus 的 SelectOption 接口定义:

export interface SelectOptionProxy {
  value: string | number | Record<string, string>;
  label: string | number;
  created: boolean;
  disabled: boolean;
  currentLabel: string;
  itemSelected: boolean;
  isDisabled: boolean;
  select: SelectContext;
  hoverItem: () => void;
  updateOption: (query: string) => void;
  visible: boolean;
  hover: boolean;
  selectOptionClick: () => void;
}
最后更新时间:
贡献者: 何风顺
上一页
父子组件与组件里 Hooks 加载顺序
下一页
Vue3 Props 在 Hooks 中的响应性处理