在 TypeScript 中导入 JavaScript 包,解决声明文件报错问题

news2024/11/17 13:21:26

前言

如果你在 TypeScript 中引入了一个纯 JavaScript 包,那很有可能会看到这样的报错:

Could not find a declaration file for module ‘@koumoul/vjsf/lib/VJsf’. ‘c:/*/node_modules/@koumoul/vjsf/lib/VJsf.js’ implicitly has an ‘any’ type.
Try npm i --save-dev @types/koumoul__vjsf if it exists or add a new declaration (.d.ts) file containing declare module '@koumoul/vjsf/lib/VJsf';Vetur(7016)

问题剖析

最近我在编写管理界面,使用了 vuetify-jsonschema-form 库来生成表单,可惜这个库有各种缺点,其中之一就是没有提供 TypeScript 的类型声明

当 import 一个没有类型声明的第三方库时,TypeScript 不知道 import 进来的东西是什么类型,只能偷偷地把它指定成 any 类型,这也就是我们常说的隐式 any(implicit any)。所有正常的前端项目都会禁止 implicit any 出现,所以就报错了。

如果你在网上搜索,网上的文章很可能会让你用这些方法:

  • 关掉 implicit-any 的检查
  • 在 import 语句上加上 // @ts-ignore

这些方法非常不推荐使用,因为这样一来我们就远离了 TypeScript 给我们的保护,给项目引入了定时炸弹。那么怎么办呢?有两种方法:

解决方案 1:安装官方的类型声明

一般来说,如果你用的是 lodash 这种大库,那么官方已经帮你写好类型声明了,只要按照这个库的官方文档,安装 @types/库名 这个库就行了。比如,使用 lodash 库的时候,只需要安装它的类型声明库:

npm install --save-dev @types/lodash

解决方案 2:使用 declare module 语法

但是,显然不是每个库都能有这种待遇。如果你用的是小库,而且官方文档里又没说怎么安装类型声明,那就只能自己动手了。

错误信息里面,有这样的一句话:

add a new declaration (.d.ts) file containing `declare module ‘@koumoul/vjsf/lib/VJsf’;

这是什么意思呢?根据官方文档,只需要在 TypeScript 的 .d.ts 文件中编写一个空的 declare module,就能把环境包当作 any 类型引入,同时又不会触发 implicit any 报错。这个操作被文档叫做 Shorthand ambient modules,意为「快速引入环境包」:

Shorthand ambient modules 语法说明

那么实际使用时要怎么做呢?我们首先在项目的任意位置建立一个 js-modules.d.ts 文件,向里面填入如下内容:

declare module '【import 的第三方库名】';

接下来可以试着重启一下 IDE,看看报错是不是已经消除了。我们来尝试一下,用 declare module 声明了 vuetify-jsonschema-form 库,然后我们观察一下引入的变量类型:

引入的变量类型是 any

可以看出,引入的模块变量确实是 any 类型,而且这样已经不算是隐式 any 了,所以不会报错。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp拍照+上传后台 + pc端上传后台

uniapp 一、拍照,拿到本地路径 首先调用uniapp的api实现拍照 uni.chooseImage({sourceType: [camera,album],//拍照或是打开系统相册选择照片count: 3, //最多三张success(res) {if (Array.isArray(res.tempFilePaths)) {//最多选择三张,如果多选删掉…

新安webpack插件后编译报错compiler.plugin is not a function

安装使用generate-asset-webpack-plugin时报错TypeError:compiler.plugin is not a function,网上搜索了一下大概就是webpack5与这些插件不匹配。推荐的方法几乎都是换一个适配的插件版本,但我所需要的这个插件在npm上最近更新时间是7年前&am…

Vue 之 插件 轮播组件 vue-awesome-swiper 的简单使用整理

Vue 之 插件 轮播组件 vue-awesome-swiper 的简单使用整理 目录 Vue 之 插件 轮播组件 vue-awesome-swiper 的简单使用整理 一、简单介绍 二、安装 vue-awesome-swiper 三、引入(全局或局部引入) 四、简单使用 一、简单介绍 Vue 开发的一些知识整理…

八个步骤实现一个Web项目(在线聊天室)

实现一个在线网页的聊天室 Hello,今天给大家带来的是我的一个Web项目的开发过程的相关步骤,这个项目实现的功能是一个Web在线聊天室,简单的来说就是实现在网页版的聊天框,能够实现对于用户信息进行注册,登录&#xff…

vue3、ts如何封装 axios,使用mock.js

今天我们一起来看一看 vue3ts如何优雅的封装axios,并结合 mock.js 实现敏捷开发; 但是我们要注意区分 Axios 和 Ajax : Ajax 是一种技术统称,技术内容包括:HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要…

Vue首次加载太慢之性能优化

Vue首次加载太慢之性能优化前言一、防止编译文件中出现map文件二、vue-router 路由懒加载三、使用gzip压缩四、使用CDN加载第三方库第一步:引入资源第二步:添加配置第三步:去掉原有的引用五、去掉代码中的console.log前言 首页加载很慢的问题…

Vite4 + Vue3 + vue-router4 动态路由

动态路由,基本上每一个项目都能接触到这个东西,通俗一点就是我们的菜单是根据后端接口返回的数据进行动态生成的。表面上是对菜单的一个展现处理,其实内部就是对router的一个数据处理。当然你只对菜单做处理也是可以的,但是没有任…

js中的内存泄漏

简版 内存泄漏一般是指变量的内存没有及时的回收,导致内存资源浪费。一般有三种情况出现内存泄露比较多。(1)常见的声明了一个全局变量,但是又没有用上,那么就有点浪费内存了,(2)定…

【Vue3】用Element Plus实现列表界面

🏆今日学习目标:用Element Plus实现列表界面 😃创作者:颜颜yan_ ✨个人格言:生如芥子,心藏须弥 ⏰本期期数:第四期 🎉专栏系列:Vue3 文章目录前言效果图目录简介修改vite…

uniapp微信小程序实现连接低功耗蓝牙打印功能

微信小程序项目中有使用到蓝牙连接打印,参考官方文档做了一个参考笔记,这样使用的时候就按着步骤查看。 uni-app蓝牙连接 蓝牙: 1、初始化蓝牙 uni.openBluetoothAdapter(OBJECT) uni.openBluetoothAdapter({success(res) {console.log(…

毫米波雷达的硬件架构与射频前端

说明 本篇博文梳理(车载)毫米波雷达的系统构成,特别地,对其射频前端各部件做细节性的原理说明。本篇博文会基于对这方面知识理解的加深以及读者的反馈长期更新内容和所附资料,有不当之处或有其它有益的参考资料可以在评论区给出,我…

vue3.x结合element-plus如何使用icon图标

基于 Vue 3的Element Plus如何使用icon图标 首先注意Element Plus版本:官网如图所示, 基于vue3的具体如何使用: 参考官网文档: 1.首先选择一种方式安装 2.然后全局注册图标 在main.js或main.ts文件中引入: import …

【web前端开发】CSS文字和文本样式

文章目录前言字体大小字体粗细字体样式字体font复合属性文本缩进文本水平对齐方式文本修饰线行高颜色标签水平居中⭐思维导图前言 本篇文章主要讲解CSS中的文字和文本样式及一些实用技巧.文章最后有思维导图. 字体大小 属性名:font-size 取值: 数字px 注意: 谷歌浏览器默认…

无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

这是我在学习 JSTL 时产生的错误。没有使用 Maven 。 是手动引入 JSTL 包(jstl.jar 和 standard.jar)。在请求转发到 .jsp 界面,再没有使用 JSTL 语句前是通的,使用 JSTL 后就会报错。org.apache.jasper.JasperException: 无法在w…

【Vue】filter 过滤器用法

文章目录一、全局过滤器二、局部过滤器一、全局过滤器 语法&#xff1a; Vue.filter(name,function) - name: 过滤器名称 - function: 执行函数&#xff0c;必须有一个过滤后的返回值使用方法&#xff1a;变量名 | 过滤器名称 {{name | function()}}示例&#xff1a; <!D…

webpack的安装

webpack是当前前端最热门的前端资源模块化管理和打包工具。 安装webpack 首先要安装Node.js&#xff0c;Node.js自带了软件包管理工具npm&#xff0c;可以使用npm安装各种插件。Webpack至少需要Node.js v0.6版本&#xff0c;直接安装最新版就好了。 1.nodeJs官网&#xff0c…

Luckysheet本地导入时报错‘luckysheet‘ is not defined【已解决】

本文包含luckysheet本地安装以及报错解决&#xff0c;性子急可以直接按照目录划拉&#xff01; 目录 一、本地导入 二、报错luckysheet is not defined解决 最近正在开发的项目中需要类excel功能的东西&#xff0c;经过调研后决定用luckysheet&#xff0c;Luckysheet在线表格…

vite + vue3 —— vue地图大屏项目

​回顾 前期 ​ 前端利器 —— 提升《500倍开发效率》 传一张设计稿&#xff0c;点击一建生成项目 好牛_0.活在风浪里的博客-CSDN博客如果非要说它有什么缺点&#xff0c;那么我觉得就是它会&#xff0c;让你cv大法都没处使&#xff01;&#xff01;&#xff01;比如…

React 面向组件编程(下)

目录前言&#xff1a;一、受控组件与非受控组件1. 受控组件2. 非受控组件3. 效果展示4. 总结&#xff1a;二、组件的生命周期1. 对生命周期的理解2. 生命周期的三个阶段&#xff08;旧&#xff09;3. 生命周期的三个阶段&#xff08;新&#xff09;4. 新旧生命周期的区别5. 重要…

微信小程序项目实例——扫雷

今日推荐&#x1f481;‍♂️ 2023许嵩演唱会即将到来&#x1f3a4;&#x1f3a4;&#x1f3a4;大家一起冲冲冲&#x1f3c3;‍♂️&#x1f3c3;‍♂️&#x1f3c3;‍♂️ &#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;往期优质项目实例&#x1f52e…