VSCode开发Vue3+TS项目中遇到各种波浪线(诊断信息)

news/2024/10/3 11:39:16 标签: vscode, ide, 编辑器, vue.js, typescript, 前端

一、问题汇总

        在使用Visual Studio Code(VSCode)开发Vue3 + TypeScript项目时,会遇到各种波浪线错误(诊断信息),这些问题或错误通常由以下几人原因引起的:

1.1 常见问题

1、typeScript配置问题

  • 确保tsconfig.json文件配置正确,这上配置文件告诉TypeSript编译如何处理项目中的.ts攻.tsx文件。
  • 检查是否包含了正确的模块解析、编译顺选项等。

2、ESLint配置问题

  • ESLint用于代码质量和风格检查,如果项目中使用了ESlint,则需要确保 .eslintrc.js 或 eslintrc.json 文件配置正确。
  • 另外项目是Vue3 + TypeScript,则需要安装并配置相应的ESLint插件,如 @vue/eslint-config-typescipt、@typescript-eslnt/eslint-plugin 和@typescript-eslint/parser。一般使用Vue3脚手架安装,会在初始化选项中选择配置。
  • 在ESlint配置中,确保parserOptions包含了{"parser": "@typescript-eslint/parser", "ecmaVersion": 2020, "sourceType": "module"} 等正确选择。

3、Vetur或Volar插件问题

  • 对于Vue项目,VSCode社区提供了两个流行的插件:Vetur和Volar。Vetur早期更受欢迎,但Volar提供了对Vue3和TypeScript的更好支持。
  • 如果使用了Vetur,遇到了TypeScript相关的问题,考虑切换到Volar。
  • 确保您的插件是最新的,并且已正确安装,并处于开启状态。

4、项目依赖问题

  • 确保项目依赖是最新的,特别是与Vue3和TypeScript相关的依赖包。
  • 使用npm install 、 pnpm 或 yarn来安装所有依赖。这里推荐使用pnpm,其安装更快速。

5、第三方插件问题

  • 确保您使用的第三方插件,是在Vue3 + TypeScript版本环境中完全适应的,有些第三方插件可能几年未更新,并不适合在Vue3+TS环境中运行,可能会导致各种未知的错误。

6、重启VSCode

  • 有时候,可能项目较大或VSCode运行较久,导致一些未知问题,可以通过重启来解决。

1.2 解决问题

1、检查错误类型

  • 仔细阅读VSCode中显示的错误或警告信息,这样可以帮助我们更快的定位到问题
  • 可以将鼠标悬浮在波浪线上,获取更多信息,如“查看问题(Alt+8)”,或“快速修复”等。

2、搜索解决问题

  • 利用互联网搜索具体的错误消息或错误代码,有可能会与其他开发者遇到雷同或相同的问题。
  • 使用ChatGPT或文心一言等大模型,对问题进行分析和搜索解决方案。

二、declare关键字

        在Vue3 + TypeScript的项目中,使用declare关键字来定义类型时,是为了告诉TypeScript编译器关于一些外部资源(如全局变量、模块扩展等)的类型信息。使用declare定义的类型通常不会直接影响组件内部或模块内部的具体实现,但可以影响TypeScript的类型检查过程。

        当代码中某些变量或方法相关的波浪线消失了,这意味着通过定义的declare提供了足够的类型信息,让TypeScript能够理解并接受当前的用法。

2.1 创建类型目录

        通常我们是在项目src目录下,创建一个types文件夹,用来创建和定义项目中需要的类型信息。通过在一个 .d.ts(声明文件)文件中声明相关类型来解决问题。

2.2 tsconfig.app.json配置

        在创建types文件夹后,需要在tsconfig.app.json中配置下,告诉Typescript编译器类型查询位置,添加typeRoots配置项,代码如下:

{
  "extends": "@vue/tsconfig/tsconfig.dom.json",
  "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
  "exclude": ["src/**/__tests__/*"],
  "compilerOptions": {
    "composite": true,
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
    "typeRoots": ["./src/types"],
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

2.3 注意事项

  • 声明文件的位置:通常是将声明文件放置在项目src/types目录下,但这不是强制的。TypeScript会查找项目根目录和node-modules/@types下的声明文件。
  • 全局作用域:使用declare声明的类型或变量是全局的,它们对项目中所有使用TypeScript的地方可见。
  • 模块扩展:如果使用了Vuex或Vue Router,可能需要使用 declare module语法来扩展该模块的类型定义。
  • 类型安全:虽然declare可以帮助我们绕开TypeScript的类型检查,但这不会为项目提供运行时安全。确保声明与运行时行为相匹配,以免导致运行时出错。

三、常见问题整理

        在开始之前,我们先在scr/types目录下创建typings.d.ts文件,用于下面相关类型问题解决,提供可定义的文件。

3.1 opera属性不存在

        如下图,在调用window对象的opera属性,显示其不存在属性“opera”。

        在typings.d.ts文件中声明以下接口类型,代码如下:

// 解决平台判断中的opera不存在问题
declare interface Window {
  opera: any
}

3.2 window不存在问题

        同样typings.d.ts中声明以下接口类型,在代码如下:

declare const window: Window | undefined

        因window有可能为undefined,所以在使用前需要先判断是否存在,示例如下:

if(window) window.location.href = '跳转地址'

3.3 document不存在问题

        声明类型,代码如下:

declare const document: Document

3.4 第三方插件

        如上图,在使用qrcode生成二维码插件时,会出现波浪线,提示错误为:

无法找到模块“qrcode”的声明文件。
尝试使用 `npm i --save-dev @types/qrcode` (如果存在),或者添加一个包含 `declare module 'qrcode';` 的新声明(.d.ts)文件

        这个提示信息给出了两种解决方案,我们使用第二种,在typings.d.ts中声明,代码如下:

// 将提示中第二种方案代码贴到typings.d.ts文件中即可
declare module 'qrcode'

3.4 类型声明

        我们也可以在types目录中创建新的 *.d.ts文件,或者在typings.d.ts中声明全局类型。

        当使用axios发送请求时,封装请求函数,并约束接口函数的入参和返回结果。这里还是在typings.d.ts中声明,代码如下:

// 请求响应类型接口(T为泛型,使用时指定)
declare interface ApiResponse<T> {
  msg: string
  status: string | number
  data: T
}

// 请求响应结果类型接口(T为泛型,使用时指定)
declare type ApiResult<T> = Promise<ApiResponse<T>>

        然后在定义接口函数时,通过关联对应类型,来约束开发者传入约定的数据,并且得到可预见的结果。接口函数 代码如下:

// axios封装文件
import Request from '@/utils/request'

// 定义通用接口函数,通过泛型N, M在运行时告诉程序,data和响应结果的数据结构类型
export const commonServiceApi = <N, M>(params: {methodName: string, data?: M}): ApiResult<N> => {
  const udata = { MethodName: params.methodName }
  Object.assign(udata, params['data'])
  return Request({
    url: APIServiceURL,
    method: "post",
    params: udata
  })
}

        使用通用接口函数,例如获取菜单数据,代码如下:

// 声明菜单数据类型
type MenuType = {
    id: number,
    name: string,
    // 略...
}

// 查询菜单数据
commonServiceApi<MenuType, unknown>({methodName: 'categoryList'}).then(res => {
    // do something...
    console.log(res)
})

        当使用通用接口函数时,指定菜单响应数据类型为MenuType,则编译器就知道响应结果为MenuType了;因为这里没有入参数据,所以第二个泛型传的是unknown。

        在Vue3 + TypeScript项目中,遇到波浪线问题,通常是类型错误、语法错误或配置问题,所以通过“一、问题汇总”中的方法,先仔细查看问题提示信息,再一一排查,基本解决绝大多数问题; 当经验积累起来后,很多问题在开发阶段就可以避免了。


http://www.niftyadmin.cn/n/5688284.html

相关文章

electron出现乱码和使用cmd出现乱码

第一种出现乱码。这种可以通过chcp 65001&#xff0c;设置为utf-8的编码。第二种&#xff0c;是执行exec的时候出现乱码&#xff0c;这个时候需要设置一些编码格式&#xff0c;可以通过iconv-lite进行解决&#xff0c;这个方法是node自带的&#xff0c;所以不需要导入。使用方法…

MySQL 索引选择详解

✨MySQL 索引选择详解✨ 引言 在使用 MySQL 进行数据查询时&#xff0c;索引是提升性能的关键工具。通过合理选择和优化索引&#xff0c;可以显著加快查询速度&#xff0c;减少磁盘 I/O&#xff0c;进而提高数据库响应时间。然而&#xff0c;有时 MySQL 可能不会选择我们预期…

文章解读与仿真程序复现思路——高电压技术EI\CSCD\北大核心《适用于并联构网型储能系统的协调有功控制策略设计》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

OpenCV第十二章——人脸识别

1.人脸跟踪 1.1 级联分类器 OpenCV中的级联分类器是一种基于AdaBoost算法的多级分类器&#xff0c;主要用于在图像中检测目标对象。以下是对其简单而全面的解释&#xff1a; 一、基本概念 级联分类器&#xff1a;是一种由多个简单分类器&#xff08;弱分类器&#xff09;级联组…

新手教学系列——爬虫异步并发注意事项

引言 爬虫是网络数据采集中不可或缺的工具,很多程序员在入门时会遇到这样的问题:为什么我的爬虫这么慢?尤其在面对大量数据时,单线程爬虫的速度可能让人捶胸顿足。随着爬虫规模的增大,异步并发成为了提高爬取效率的关键。然而,异步并发并不像表面看起来那么简单,如果没…

单链表的增删改查(数据结构)

之前我们学习了动态顺序表&#xff0c;今天我们来讲一讲单链表是如何进行增删改查的 一、单链表 1.1、单链表概念 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1.2、链表与顺序表的…

Ascend C 自定义算子开发:高效的算子实现

Ascend C 自定义算子开发&#xff1a;高效的算子实现 在 Ascend C 平台上&#xff0c;开发自定义算子能够充分发挥硬件的性能优势&#xff0c;帮助开发者针对不同的应用场景进行优化。本文将以 AddCustom 算子为例&#xff0c;介绍 Ascend C 中自定义算子的开发流程及关键技术…

rabbitMq------虚拟机管理模块

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言管理的对象提供的操作申明/删除交换机申明/删除队列绑定/解除绑定发布消息消费消息/消息确认 前言 虚拟机管理模块就是对交换机/队列/绑定/消息管理的一个整合…