用 @types 前缀的包是什么?有什么用?

news2025/1/16 18:53:51

前言

解决过 TypeScript 的项目大概都是从两个方向,Vue3 方向和 React Native 方向,而在 React Native 方向上我经常会遇到一个烦人的错误

Could not find a declaration file for module ‘juejin-type-study’. ‘d:/fe-project/nodejs/types-study/node_modules/juejin-type-study/main.js’ implicitly has an ‘any’ type.> Try npm i --save-dev @types/types-study if it exists or add a new declaration (.d.ts) file containing declare module 'juejin-type-study';

PS: juejin-type-study 代指 npm 包,也是文章的例子

这个问题的场景通常出现于 ts 项目中引用包时会出现

// main.ts
import { util } from "juejin-type-study";

util(); 

PS: ts 指代 TypeScript

问题起因

ts 作为一个有类型的语言,在 .ts 文件引用包时,默认时必须要有类型声明的,不能是 any,而 ts 对于包(module)的类型声明要求为提供 .d.ts,否则就要在 tsconfig.json 中声明

那么就有一个问题了,ts 是怎么找到包/模块的类型声明的?

TS 寻找类型规则

ts 对于包/模块的声明寻找规则如下

1.TypeScript 编译器先在当前编译上下文找模块的定义
2.如果找不到,则会去 node_modules 中的 @types(默认情况,目录可以修改,后面会提到)目录下去寻找对应包名的模块声明文件

说实话 TypeScript 的文档真的不怎样,虽然有中文文档,但文档整个的逻辑很乱,知识点东一块西一块,找起来很麻烦,像此类的寻址规则,通常文档会给出一个很严谨的描述,比如 Node.js 的模块寻址,但我在 ts 的文档里愣是半天没找着,等我找到了会更新一个更严谨的规则

作用

.ts 文件和 .js 文件不一样,对于 node.js 环境中 .js 有自己的模块寻址规则,而对于 ts 环境中 .ts 文件中的模块就是类型声明,ts 依靠类型声明来实现自己的功能,而 @types 其实就是类型声明的集中仓库,为 ts 项目中的引用提供类型说明

为什么需要 @types 这个目录?原因是过去很多模块/包是用的纯 JS 写的,没有类型声明,ts 就无法给到自动补全和智能提示等功能

下面就通过解决之前提出过的问题来解释实际中的 @types 是咋用的

创建 Module

在此之前我们需要一个模块来作为项目中引用的 Module,毕竟 @types 中包含的就是 Module 的类型声明

那没有 npm 包怎么办?需要去 npm 网站里创建一个吗?

实际上并不需要,了解过 Node.js 关于模块的寻址规则就可以直接在 node_modules 目录下伪造一个模块,具体原理可以参考这篇文章

node_modules 中创建一个 juejin-type-study 的目录,里面只需要包含两个文件,main.jspackage.json

// main.js
export const util = () => {
  console.log("Hello World");
}; 

创建 .d.ts

之前的 ts 给出一个警告中包含一个解决方案,其中如下

Try npm i --save-dev @types/types-study if it exists or add a new declaration (.d.ts) file containing declare module 'juejin-type-study';

里面提到可以创建一个 .d.ts 文件,包含 declare module 'juejin-type-study'; 就可以解决这个问题

实际操作就是在根目录下随便取个名字创建 .d.ts,通常为缺失类型声明的模块名称,如下

declare module 'juejin-type-study' {
  export function util(): void;
} 

_Module .d.ts 的模板可以查看文档
创建之后就不会再报错了,如下

@types 本质上也是一样,ts 会自动帮我们识别 .d.ts 的位置,默认是根目录和 /node_modules/@types/[libname]/index.d.ts

注意,VS Code 对于类型提示和警告似乎有缓存,如果将 .d.ts 迁移位置后仍然报错可以尝试删除模块引用重新输入

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

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

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

相关文章

看懂这篇文章-你就懂了信息安全的密码学

一、前言一个信息系统缺少不了信息安全模块,今天就带着大家全面了解并学习一下信息安全中的密码学知识,本文将会通过案例展示让你了解抽象的密码学知识,阅读本文你将会有如下收获: 熟悉现代密码学体系包含的主流密码技术 掌握Base…

SignalR 实时通讯

SignalR 实时通讯1.SignalR1.1.SignalR 简介1.2.SignalR 功能1.3.传输1.4.中心2.服务器2.1.配置中心2.2.上下文对象2.3.客户端对象2.4.创建2.5.中心功能实现4.客户端6.案例演示(DotNet 客户端)1.SignalR 1.1.SignalR 简介 SignalR 是一个开放源代码库&a…

内容感知、AI融合:让实景三维看山是山,看水是水

实景三维具备还原客观物理世界的优势性,但也正由于部分真实性的欠缺备受争议。这是因为传统的三维建模软件大多基于像元的匹配与计算的逻辑,对地物进行无差别的重建处理,最终生成的模型看起来扭曲怪异、残缺变形。常见的模型缺陷有&#xff1…

2022 OpenCV Spatial AI大赛前三名项目分享,开源、上手即用,优化了OAK智能双目相机的深度效果。

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…

深圳居住证申领指南

打开广东政务服务网,在首页搜索【深圳经济特区居住证申领】在搜索结果中可以发现有如下链接,点击在线办理 会转到登陆界面,直接使用个人登录并用微信扫描登录 根据提示进行手机登录验证。 完成登录认证之后会自转到深圳经济特区居住证申领界…

二分查找由浅入深--算法--java

二分查找写在开头算法前提:算法逻辑算法实现简单实现leftright可能超过int表示的最大限度代码分析和变换更多需求:求索引最小的值java二分API应用基础题思考难度方法写在开头 二分查找应该是算比较简单的这种算法了,我本以为还可以。但有时候…

Word处理控件Aspose.Words功能演示:使用 Java 比较 MS Word 文档

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…

动态规划初阶-爬楼梯问题

示例1: 输入:cost [10,15,20] 输出:15 解释:你将从下标为 1 的台阶开始。 - 支付 15 ,向上爬两个台阶,到达楼梯顶部。 总花费为 15 。示例2: 输入:cost [1,100,1,1,1,100,1,1,10…

使用Docker安装MongoDB,整合SpringBoot

使用Docker安装MongoDB MongoDB 和 MySQL 都是常用的数据库管理系统,但它们的设计目标不同,因此在某些方面的性能表现也有所不同。 MongoDB 是一个文档型数据库,它采用了面向文档的数据模型,支持动态查询和索引,适合…

Docker部署实战

文章目录Docker部署应用准备制作容器镜像启动容器上传镜像docker exec数据卷(Volume)声明原理实践Docker部署 应用准备 这一次,我们来用 Docker 部署一个用 Python 编写的 Web 应用。这个应用的代码部分(app.py)非常…

【同步、共享和内容协作软件】上海道宁与​ownCloud让您的团队随时随地在任何设备上轻松处理数据

ownCloud是 一款开源文件同步、共享和 内容协作软件 可让团队随时随地 在任何设备上轻松处理数据 ownCloud开发并提供 用于内容协作的开源软件 使团队能够轻松地无缝 共享和处理文件 而无需考虑设备或位置 开发商介绍 ownCloud成立于2010年,是一个托管和同…

设计模式-笔记

文章目录七大原则单例模式桥模式 bridge观察者模式 observer责任链模式 Chain of Responsibility命令模式 Command迭代器模式 Iterator中介者模式 Mediator享元模式 Flyweight Pattern组合模式 composite装饰模式 Decorator外观模式 Facade简单工厂模式工厂方法模式工厂抽象模式…

Postgresql中的unlogged table

在PG中,有一种表的类型为unlogged table,名如其字,该种类型的表不会写入wal日志中,所以在写入的速度上比普通的堆表快很多,但是该表在数据库崩溃的时候,会被truncate,数据会丢失,而且该表也不支…

Leetcode21. 合并两个有序链表

一、题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4]输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2…

Java程序开发中如何使用lntelliJ IDEA?

完成了IDEA的安装与启动,下面使用IDEA创建一个Java程序,实现在控制台上打印HelloWorld!的功能,具体步骤如下。 1.创建Java项目 进入New Project界面后,单击New Project选项按钮创建新项目,弹出New Project对话框&…

【k8s】Kubernetes的学习(1.k8s概念和架构)

目录 1.首先要知道,Kubernetes为什么简称为k8s? 2.Kubernetes概述 2.1 kubernetes基本介绍 2.2 kubernetes的特性 2.3 kubernetes集群架构组件 2.3.1 Master (主控节点) 2.3.2 node (工作节点) 2.4 k8s核心概念 2.4.1 Pod 2.4.2 controller 2.4.3 Se…

操作系统权限提升(十九)之Linux提权-SUID提权

系列文章 操作系统权限提升(十八)之Linux提权-内核提权 SUID提权 SUID介绍 SUID是一种特殊权限,设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限,例如程序文件的属主是root,那么执行该…

redux-saga

redux-saga 官网:About | Redux-Saga 中文网:自述 Redux-Saga redux-saga 是一个用于管理 异步获取数据(副作用) 的redux中间件;它的目标是让副作用管理更容易,执行更高效,测试更简单,处理故障时更容易… …

C#:Krypton控件使用方法详解(第十讲) ——kryptonColorButton

今天介绍的Krypton控件中的kryptonColorButton,下面介绍这个控件的外观属性:Cursor属性:表示鼠标移动过该控件的时候,鼠标显示的形状。属性值如下图所示:EmptyBorderColor属性:表示当所选颜色为空时&#x…

七、JUC并发工具

文章目录JUC并发工具CountDownLatch应用&源码分析CountDownLatch介绍CountDownLatch应用CountDownLatch源码分析有参构造await方法countDown方法CyclicBarrier应用&源码分析CyclicBarrier介绍CyclicBarrier应用CyclicBarrier源码分析CyclicBarrier的核心属性CyclicBarr…