vue-tsc --noEmit导致打包报TS类型错误

🐱 个人主页:不叫猫先生,公众号:前端舵手
🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫优质专栏:vue3+vite+typeScript从入门到实践
📢 资料领取:前端进阶资料可以找我免费领取
🔥 摸鱼学习交流:我们的宗旨是在「工作中摸鱼,摸鱼中进步」,期待大佬一起来摸鱼(文末有我wx或者私信)。

目录

  • 背景
  • 问题描述
  • 分析
  • 解决

背景

当我们新建vue3项目,package.json文件会自动给我添加一些配置选项,这写选项基本没有问题,但是在实际操作过程中,当项目越来越复杂就会出现问题。本文列举一个目前我遇到的一个问题:打包后报了一堆TS类型错误,怎么消除这些错误?

项目环境:Vue3 + Vite + TS

问题描述

当项目进行打包时候,突然发现终端有几十项报错

npm run build

详细报错信息如下:

src/view/testDemo/index.vue:6:9 - error TS2339: Property 'proxy' does not exist on type 'ComponentInternalInstance | null'.6 const { proxy } = getCurrentInstance();~~~~~src/view/echarts/index.vue:7:9 - error TS2339: Property 'proxy' does not exist on type 'ComponentInternalInstance | null'.7 const { proxy } = getCurrentInstance();~~~~~src/view/webRTC/index.vue:5:23 - error TS2322: Type 'string | number' is not assignable to type 'string | undefined'.Type 'number' is not assignable to type 'string'.5                 <img :src=" item" alt="" />~~~node_modules/@vue/runtime-dom/dist/runtime-dom.d.ts:616:3616   src?: string~~~The expected type comes from property 'src' which is declared here on type 'ElementAttrs<ImgHTMLAttributes>'src/view/webRTC/index.vue:13:55 - error TS2322: Type '(deviceId: string) => Promise<void>' is not assignable to type '(evt: MouseEvent) => any'.Types of parameters 'deviceId' and 'evt' are incompatible.Type 'MouseEvent' is not assignable to type 'string'.13             <el-button type="primary" size="default" @click="handleDeviceChange">~~~~~src/layout/index.vue:14:22 - error TS2322: Type '{}' is not assignable to type 'IntrinsicAttributes & Partial<{ readonly disabled: boolean; readonly showTimeout: number; readonly hideTimeout: number; readonly popperAppendToBody: EpPropMergeType<BooleanConstructor, unknown, unknown>; readonly popperOffset: number; }> & Omit<...>'.Property 'index' is missing in type '{}' but required in type 'Omit<Readonly<ExtractPropTypes<{ readonly index: { readonly type: PropType<string>; readonly required: true; readonly validator: ((val: unknown) => boolean) | undefined; __epPropKey: true; }; readonly showTimeout: EpPropFinalized<...>; ... 8 more ...; readonly collapseOpenIcon: { ...; }; }>> & VNodeProps & AllowedCo...'.14                     <el-sub-menu>~~~~~~~~~~~node_modules/element-plus/es/components/menu/index.d.ts:363:14363     readonly index: {~~~~~'index' is declared here.src/view/testDemo/index.vue:27:32 - error TS2345: Argument of type 'HTMLElement | null' is not assignable to parameter of type 'HTMLElement'.Type 'null' is not assignable to type 'HTMLElement'.27     var myChart = echarts.init(document.getElementById("trendLIne-content"));~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~src/view/testDemo/index_.vue:41:40 - error TS2552: Cannot find name 'myData'. Did you mean 'data'?41                                 value: myData[dataIndex],~~~~~~src/view/testDemo/index_.vue:7:57 let data = reactive([~~~~'data' is declared here.src/view/echarts/index.vue:40:32 - error TS2345: Argument of type 'HTMLElement | null' is not assignable to parameter of type 'HTMLElement'.Type 'null' is not assignable to type 'HTMLElement'.40     var myChart = echarts.init(document.getElementById("trendLIne-content"));~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~src/view/testDemo/index.vue:42:40 - error TS2552: Cannot find name 'myData'. Did you mean 'data'?42                                 value: myData[dataIndex],~~~~~~src/view/testDemo/index.vue:7:57 let data = reactive([~~~~'data' is declared here.src/layout/index.vue:65:20 - error TS2339: Property '$fil' does not exist on type 'ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string>, {}>'.65 console.log(proxy?.$fil, "proxy");~~~~src/view/webRTC/index.vue:136:5 - error TS2322: Type '{ facingMode: string; }' is not assignable to type 'boolean'.136     constraints.video = {~~~~~~~~~~~~~~~~~src/view/webRTC/index.vue:146:13 - error TS2304: Cannot find name 'ElMessage'.146             ElMessage.success("切换成功");~~~~~~~~~src/view/webRTC/index.vue:150:13 - error TS2304: Cannot find name 'ElMessage'.150             ElMessage.error("你的设备不支持切换前后摄像头");~~~~~~~~~src/view/webRTC/index.vue:156:28 - error TS2304: Cannot find name 'multiavatar'.156     const blob = new Blob([multiavatar(val + new Date().getTime())], {~~~~~~~~~~~src/view/testDemo/index.vue:168:9 - error TS1117: An object literal cannot have multiple properties with the same name.168         grid: {~~~~src/directives/canvasMakeWaterMark.ts:30:3 - error TS18047: 'ctx' is possibly 'null'.30   ctx.rotate((rotate * Math.PI) / 180);~~~src/directives/canvasMakeWaterMark.ts:31:3 - error TS18047: 'ctx' is possibly 'null'.31   ctx.font = "16px normal";~~~src/directives/canvasMakeWaterMark.ts:32:3 - error TS18047: 'ctx' is possibly 'null'.32   ctx.fillStyle = "rgba(180, 180, 180, 0.3)";~~~src/directives/canvasMakeWaterMark.ts:33:3 - error TS18047: 'ctx' is possibly 'null'.33   ctx.textAlign = "left";~~~src/directives/canvasMakeWaterMark.ts:34:3 - error TS18047: 'ctx' is possibly 'null'.34   ctx.textBaseline = "middle";~~~src/directives/canvasMakeWaterMark.ts:35:3 - error TS18047: 'ctx' is possibly 'null'.35   ctx.fillText('请勿外传', canvas.width / 3, canvas.height / 2);~~~src/directives/canvasMakeWaterMark.ts:59:26 - error TS2554: Expected 0 arguments, but got 1.59   const url = getDataUrl(binding);~~~~~~~src/directives/canvasMakeWaterMark.ts:68:3 - error TS18047: 'parentElement' is possibly 'null'.68   parentElement.setAttribute("style", "position: relative;");~~~~~~~~~~~~~src/directives/canvasMakeWaterMark.ts:71:3 - error TS18047: 'parentElement' is possibly 'null'.71   parentElement.appendChild(waterMark);~~~~~~~~~~~~~src/directives/canvasMakeWaterMark.ts:81:23 - error TS18047: 'el.parentElement' is possibly 'null'.81   const waterMarkEl = el.parentElement.querySelector(".water-mark");~~~~~~~~~~~~~~~~src/directives/canvasMakeWaterMark.ts:87:25 - error TS18047: 'waterMarkEl' is possibly 'null'.87       const currStyle = waterMarkEl.getAttribute("style");~~~~~~~~~~~src/directives/canvasMakeWaterMark.ts:116:20 - error TS2345: Argument of type 'HTMLElement | null' is not assignable to parameter of type 'Node'.Type 'null' is not assignable to type 'Node'.116   observer.observe(el.parentElement, {~~~~~~~~~~~~~~~~

截图图片如下:
在这里插入图片描述

分析

打包执行的是npm run build命令,那么具体执行了什么呢?我们查看package.json中配置项。

  "scripts": {"dev": "vite","build": "vue-tsc --noEmit && vite build","preview": "vite preview"},

可以发现在build时,执行了vue-tsc --noEmit && vite build,其中

  • vue-tsc:Vue 官方提供的命令,用于执行 TS 的类型检查。它在执行时会根据项目中的 tsconfig.json 文件配置进行类型检查

  • --noEmit:TS 编译器的选项,使用 --noEmit 选项后,编译器仅执行类型检查,而不会生成任何实际的编译输出

所以可以看出了,在打包的时候编译器执行了TS类型检查,所以才报了一堆错,类型错误最终不会影响项目的正常运行

解决

根据上面分析,package.json中的"scripts"修改如下:

  "scripts": {"dev": "vite","build": "vite build","preview": "vite preview"},

另外项目通常在编译时候,也会对我们引入的一些依赖包进行类型校验,我们并不需要这个操作,所以可以在tsconfig.json中设置如下:

 "compilerOptions": {"skipLibCheck": true},

设置后编译器不会检查库文件中的类型定义是否正确,也不会对库文件的使用进行类型检查。

再次打包就非常顺利~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1107.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript——泛型

泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性。 函数泛型 本来函数参数类型的不同时&#xff0c;要写多个&#xff0c;现在用泛型&#xff0c;只需要使用时传参即可…

吉他如何实现内录or通过转接头和简易声卡连接电脑没有声音怎么办

目录 效果器or智能音箱 电吉他和效果器的连接 效果器和耳机or音箱连接 内录方法 为什么用6.5mm&#xff08;入&#xff09;转3.5mm&#xff08;出&#xff09;转接头内录无声音 整体连接图示 这篇文章我会以通俗的语言为初学者描述如何让电吉他“燃起来”&#xff0c;效果…

Idea项目application.properties配置文件默认GBK,如何设置默认为UTF-8编码

简述&#xff1a;java程序在项目中一般设置都是UTF-8编码格式&#xff0c;但是项目application.properties 文件默认是GBK,需要手工修改默认编码格式 步骤&#xff1a; file->setting->editor->file encodings下&#xff0c;勾选transparent native-to-ascll conver…

亚马逊云科技以用户为中心,持续丰富安全服务和解决方案

AI加持安全&#xff0c;自动化运营成未来趋势 亚马逊云科技始终在云安全领域不断创新探索、深耕发力&#xff0c;随着全球技术的发展而持续迭代安全能力。 当下&#xff0c;以ChatGPT为代表的AIGC成为最出圈的热点&#xff0c;大量的科技巨头纷纷涌入AI赛道&#xff0c;投入了…

森海塞尔重磅推出TC Bars智能音视频一体机, 为中小型协作空间缔造理想解决方案

森海塞尔重磅推出TC Bars智能音视频一体机&#xff0c; 为中小型协作空间缔造理想解决方案 全球音频行业先驱森海塞尔重磅推出首款内置摄像头的可扩展一体化会议设备 德国韦德马克&#xff0c;2023年6月13日——森海塞尔作为先进音频技术的首选&#xff0c;致力于使协作与学习…

Clickhouse物化视图原理和使用详解

前言 ClickHouse广泛用于用户和系统日志查询场景中&#xff0c;主要针对于OLAP场景&#xff0c;为业务方提供稳定高效的查询服务。在业务场景下&#xff0c;数据以不同的格式、途径写入到clickhouse。用传统JOIN方式查询海量数据&#xff0c;通常有如下痛点: 每个查询的代码冗…

RabbitMQ灵活运用,怎么理解五种消息模型

RabbitMQ灵活运用&#xff0c;怎么理解五种消息模型 简介一、AMQP协议二、交换机类型与默认交换机1. 交换机的四种类型2. 默认交换机 三、五种模式速览1. 一对一简单模式2. work模式&#xff08;轮询&#xff09;3. 发布/订阅模式4. 路由模式&#xff08;自称direct模式&#x…

Redis 简介与数据类型介绍

目录 ​编辑 一、Redis是什么&#xff1f; 二、redis五大基本类型 2.1 String(字符串) 2.1.1 应用场景 1&#xff09;缓存功能 2&#xff09;计数器 3&#xff09;统计多单位的数量 4&#xff09;共享用户session 2.2 List(列表) 2.2.1 应用场景 1&#xff09;消息队列 2…

Python学习—装饰器的力量

Python学习—装饰器的力量 作为许多语言都存在的高级语法之一&#xff0c;装饰器是你必须掌握的知识点。 Python的装饰器&#xff08;Decorator&#xff09;允许你扩展和修改可调用对象&#xff08;函数、方法和类&#xff09;的行为&#xff0c;而无需永久修改可调用的对象本身…

蓝桥杯专题-试题版-【龟兔赛跑预测】【回形取数】【阶乘计算】【矩形面积交】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

高性能消息中间件 RabbitMQ

一、RabbitMQ概念 1.1 MQ是什么 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复&#xff1a; 异步通信相…

Spring是什么?

目录 1、Spring的简介 2、Spring七大功能模块 3、Spring的优点 4、Spring的缺点 5、Sprig容器 6、Spring的生态圈&#xff08;重点&#xff09;***** 7、Spring中bean的生命周期 1、Spring的简介 Spring的英文翻译为春天&#xff0c;可以说是给Java程序员带来了春天&…