【前端进阶】-TypeScript类型声明文件详解及使用说明

news/2024/5/14 16:38:00/文章来源:https://blog.csdn.net/xuxuii/article/details/126923067

前言

博主主页👉🏻蜡笔雏田学代码
专栏链接👉🏻【TypeScript专栏】
前三篇文章讲解了TypeScript的一些高级类型
详细内容请阅读如下:🔽
【前端进阶】-TypeScript高级类型 | 泛型约束、泛型接口、泛型工具类型
【前端进阶】-TypeScript高级类型 | 交叉类型、索引签名类型、映射类型
【前端进阶】-TypeScript高级类型 | 类的初始化、构造函数、继承、成员可见性
今天来学习TypeScript的类型声明文件相关知识!
感兴趣的小伙伴一起来看看吧~🤞

在这里插入图片描述

文章目录

  • TypeScript 类型声明文件
    • 概述
    • TS中的两种文件类型
    • 类型声明文件的使用说明
      • 一、使用已有的类型声明文件
        • A. 内置类型声明文件
        • B. 第三方库的类型声明文件
      • 二、创建自己的类型声明文件
        • A. 项目内共享类型
        • B. 为已有JS文件提供类型声明

TypeScript 类型声明文件

概述

今天几乎所有的JavaScript应用都会引入许多第三方库来完成任务需求。

这些第三方库不管是否是用TS编写的,最终都要编译成JS代码,才能发布给开发者使用。

我们知道是TS提供了类型,才有了代码提示和类型保护等机制。

但在项目开发中使用第三方库时,你会发现它们几乎都有相应的TS类型,这些类型是怎么来的呢?类型声明文件

类型声明文件:用来为已存在的JS库提供类型信息。

这样在TS项目中使用这些库时,就像用TS一样,都会有代码提示,类型保护等机制了。

  1. TS的两种文件类型
  2. 类型声明文件的使用说明

TS中的两种文件类型

TS中有两种文件类型:1 .ts文件 2 .d.ts文件

.ts文件:

  1. 既包含类型信息又可执行代码。
  2. 可以被编译为.js文件,然后,执行代码。
  3. 用途:编写程序代码的地方

.d.ts文件:

  1. 只包含类型信息的类型声明文件。
  2. 不会生成.js文件,仅用于提供类型信息。
  3. 用途:为JS提供类型信息

总结:.ts是implementation(代码实现文件);.d.ts是declaration(类型声明文件)。

如果要为JS库提供类型信息,要使用.d.ts 文件。

类型声明文件的使用说明

在使用TS开发项目时,类型声明文件的使用包括以下两种方式:

  1. 使用已有的类型声明文件
  2. 创建自己的类型声明文件

学习顺序:先会用(别人的)再会写(自己的)。


一、使用已有的类型声明文件

1、内置类型声明文件; 2、第三方库的类型声明文件

A. 内置类型声明文件

TS为JS运行时可用的所有标准化内置API都提供了声明文件。

比如,在使用数组时,数组所有方法都会有相应的代码提示以及类型信息:

(method)Array<number>.forEach(callbackfn:(value: number, index:number, array: number[]) 
=> void, thisArg?: any): void

实际上这都是TS提供的内置类型声明文件。

可以通过Ctrl+鼠标左键来查看内置类型声明文件内容。

比如,查看forEach方法的类型声明,在VScode中会自动跳转到lib.es5.d.ts类型声明文件中。

当然,像window,document等BOM,DOM API也都有相应的类型声明(lib.dom.d.ts)。

B. 第三方库的类型声明文件

目前,几乎所有常用的第三方库都有相应的类型声明文件。

第三方库的类型声明文件有两种存在形式:1、库自带类型声明文件 2、由DefinitelyTyped提供

a. 库自带类型声明文件

比如,axios。

在这里插入图片描述

解释:这种情况下,正常导入该库,TS就会自动加载库自己的类型声明文件,以提供该库的类型声明。

b. 由DefinitelyTyped提供

DefinitelyTyped是一个github仓库,用来提供高质量TypeScript类型声明。

可以通过npm/yarn来下载该仓库提供的TS类型声明包,这些包的名称格式为:@types/*。

比如,@types/react,@types/lodash等。

说明:在实际项目开发时,如果你使用的第三方库没有自带的声明文件,VScode会给出明确的提示。

在这里插入图片描述

解释:当安装@types/*类型声明包后,TS也会自动加载该类型声明包,以提供该库的类型声明。

补充:TS官方文档提供了一个页面,可以来查询@types/*库。


二、创建自己的类型声明文件

A、 项目内共享类型 ;B、为已有JS文件提供类型声明

A. 项目内共享类型

如果多个.ts文件都用到同一个类型,此时可以创建.d.ts文件提供该类型,实现类型共享

// a.ts
import { Props } from './index'  //通过import导入
// type Props = { x: number; y: number }let p1: Props = {x: 1,y: 2
}
// b.ts
import { Props } from './index'  //通过import导入
// type Props = { x: number; y: number } let p2: Props = {x: 12,y: 24
}
// index.d.ts
type Props = { x: number; y: number }
export { Props }  //创建需要共享的类型,并使用export导出

操作步骤:

  1. 创建index.d.ts类型声明文件。
  2. 创建需要共享的类型,并使用export导出(TS中的类型也可以使用import/export实现模块化功能)。
  3. 在需要使用共享类型的.ts文件中,通过import导入即可(.d.ts后缀导入时,直接省略)。

B. 为已有JS文件提供类型声明

概述:

  1. 将JS项目迁移到TS项目时,为了让已有的.js文件有类型声明。
  2. 成为库作者,创建库给他人使用。

注意:类型声明文件的编写与模块化方式相关,不同的模块化方式有不同的写法。但由于历史原因,JS模块化的发展经历过多种变化(AMD,CommonJS,UMD,ESModule等),而TS支持各种模块化形式的类型声明。这就导致,类型声明文件相关内容又多又杂。

演示:基于最新的ESModuleimport/export)来为已有.js文件,创建类型声明文件。

开发环境准备:使用webpack搭建,通过ts-loader处理.ts文件。

说明TS项目中也可以使用.js文件。

说明:在导入.js文件时,TS会自动加载与.js同名的.d.ts文件,以提供类型声明。

declare关键字:用于类型声明,为其他地方(比如,.js文件)已存在的变量声明类型,而不是创建一个新的变量

  1. 对于type,interface等这些明确就是TS类型的(只能在TS中使用的),可以省略declare关键字。
  2. 对于let,function等具有双重含义(在JS,TS中都能用),应该使用declare关键字,明确指出此处用于类型声明。
// index.ts文件
//导入.js文件时,自动加载.js文件的类型声明文件.d.ts,然后就能用到声明好的类型了
import { count, songName, add, Point} from './utils'type Person = {name: stringage: number
}let p:Partial<Person> = {name: 'jack'
}let p1: Point = {x: 10,y: 20
}
console.log('项目启动了')
console.log('count', count)
console.log('songName', songName)
console.log('add()', add(1, 4))
//utils.js文件
let count = 10
let songName = '痴心绝对'
let position = {x: 0,y: 0
}
//函数声明形式
function add(x, y) {return x + y
}function changeDirection(direction) {console.log(direction)
}
//函数表达式形式
const fomartPoint = point => {console.log('当前坐标:',point)
}export { count, songName, position, add, changeDirection, fomartPoint }
//utils.d.ts文件
//为utils.js文件来提供类型声明
declare let count: number  //为已存在的变量声明类型
declare let songName: string
interface Point {x: numbery: number
}
declare let position: Pointdeclare function add(x: number, y: number): number
declare function changeDirection(direction: 'up' | 'down' | 'left' | 'right'): void//自定义函数类型
type FomartPoint = (point: Point) => void
declare const fomartPoint: FomartPoint//注意:类型提供好以后,需要使用 模块化方案 中提供的模块化语法,来导出声明好的类型。
//然后,才能在其他的.ts文件中使用。
export { count, songName, position, add, changeDirection, fomartPoint }

今天的分享就到这里啦✨\textcolor{red}{今天的分享就到这里啦✨}今天的分享就到这里啦

原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}原创不易,还希望各位大佬支持一下

🤞 点赞,你的认可是我创作的动力!\textcolor{green}{点赞,你的认可是我创作的动力!}点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!\textcolor{green}{收藏,你的青睐是我努力的方向!}收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!\textcolor{green}{评论,你的意见是我进步的财富!}评论,你的意见是我进步的财富!

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

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

相关文章

Google Pub/Sub入门

什么是Google Pub/Sub&#xff1f; 首先他是一个messaging buffer/coupler消息缓冲区/耦合器&#xff0c;Decouples senders and receivers解耦发送者和接收者。 一些特性&#xff1a; 使用 Dataflow 注入分析事件并将其流式插入到 BigQuery免运维、安全、可伸缩的消息传递系…

MySQL基础总结合集

MySQL是啥&#xff1f;数据库又是啥&#xff1f; MySQL&#xff1a; MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。 数据库&#xff1a; 数…

基于nodejs+vue的读书会网站

实行网上读书会网站&#xff0c;对其改善目前人们读书现状提供一些帮助和优化措施&#xff0c;为人们在未来看书节约了很多时间&#xff0c;使得人们在未来利用自己有限的时间可以看到更多对自己有益的书籍。 基于Vue的读书会网站的实现&#xff0c;通过网上系统的研发构造&…

你是否想过,GitHub Pages也可以自动构建?|原创

本文讲述了如何利用 GitHub Actions 来自动构建 GitHub Pages 项目&#xff0c;免去繁琐的手动构建再提交过程&#xff0c;让你专注于写作。点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达GitHub Actions 自动构建之前的文章我们已经讲过…

Tomcat 在IDEA中运行Tomcat,控制台乱码问题的解决方案

IDEA中运行Tomcat,控制台乱码问题的解决方案试了好多种网上的方案(只有这一种能解决)环境:jdk 11 idea 2022.2.4 tomcat 9.0.54解决方案: 1.打开tomcat的配置文件(apache-tomcat-9.0.54\conf\logging.properties)将文件中的java.util.logging.ConsoleHandler.encoding =…

el-tree增加提示语

element ui tree树形控件加提示信息<el-tree :data="tieLinedata" :props="defaultProps" @node-click="handleNodeClick"><span class="span-ellipsis" slot-scope="{ node, data }"><span :title="no…

【图像增强】基于DEHAZENET和HWD的水下去散射图像增强附matlab代码

1 内容介绍 去散射和边缘增强是解决水下图像的对比度严重衰减、颜色偏差和边缘模糊等问题的关键步骤。这篇论文提出了一种较好的水下图像增强的方法。首先使用经过端到端训练的卷积神经网络去测量输入图片&#xff0c;同时以自适应双边滤波器对传输图片进行处理。接着提出一种…

allure介绍——生成完美的测试报告

一、allure简介 Allure是输出网页测试报告的一种框架 1、该框架是基于Java写的,所以安装该框架需要先安装JDK; 2、下载allure命令行工具,路径:https://github.com/allure-framework/allure2/releases 注:①下载包放到pytest文件夹中,然后将allure/bin的路径放到环境变量的…

css font-size设置小于12px失效(转)

原文:https://blog.csdn.net/weixin_38629529/article/details/119866495 1、描述 不知道你有没有遇到这样的情况,设置了font-size为10px,打开控制台审查元素也显示的是10px,但浏览器渲染的字体大小还是没有发生改变。 这是因为浏览器(以Chrome为例,其他没测试过)在中文…

第五篇、Callable接口实现多线程

文章目录前言一、实现Callable接口二、代码示例1.Callable接口实现多线程总结前言 上一篇我们共同认识了并发问题&#xff0c;那么本篇我们将一起来学习Callable接口实现多线程。 一、实现Callable接口 上篇内容我们通过实现Runnable实现多线程&#xff0c;本篇我们将学习如何…

非零基础自学Java (老师:韩顺平) 第13章 常用类 13.11 日期类

非零基础自学Java (老师&#xff1a;韩顺平) ✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】 第13章 常用类 文章目录非零基础自学Java (老师&#xff1a;韩顺平)第13章 常用类13.11 日期类13.11.1 第一代日期类13.11.2 第二代日期类13.11.3 第三代日期类13.11.4 Dat…

线稿图视频制作--从此短视频平台不缺上传视频了

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f970; 博客首页&#xff1a;knighthood2001 &#x1f6…

[unity][通过代码]控制模型旋转,动态改变模型角度,让模型转动到固定角度

阅读建议 ⏰阅读时长 : 10分钟 &#x1f3eb;阅读难度 : 初级 &#x1f33e;阅读收获 : 了解模型的旋转基本原理,了解瞬间旋转和过度旋转的理论,并学习到一种过渡方式的代码编写 &#x1f587;例子地址 : https://gitee.com/asiworld/unity3d-basic-function-code &#x1f921…

Vulnhub_Noob

本文内容涉及程序/技术原理可能带有攻击性&#xff0c;仅用于安全研究和教学使用&#xff0c;务必在模拟环境下进行实验&#xff0c;请勿将其用于其他用途。因此造成的后果自行承担&#xff0c;如有违反国家法律则自行承担全部法律责任&#xff0c;与作者及分享者无关主机信息K…

ESP8266-Arduino编程实例-PCT2075温度数字转换器驱动

PCT2075温度数字转换器驱动 1、PCT2075介绍 PCT2075 是一款温度数字转换器,在 ‑25 C 至 +100 C 范围内具有 1 C 的精度。它使用片上带隙温度传感器和 Sigma-Delta A-D 转换技术,具有过温检测输出,是其他 LM75 系列热传感器的直接替代品。 该设备包含多个数据寄存器: 配置…

攻防世界 - (题目名称-文件包含)

我会在 writeup 中写出我在解决这道题时遇到的问题&#xff0c;以及对问题的思考&#xff0c;而不是直接给出 payload。 进入场景&#xff1a; 显然是考文件包含&#xff0c;第一反应是用 php://filter 加 convert.base64-encode 文件读取 flag.php&#xff1a; 提示 "do…

consul部署

docker consul的容器服务更新与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保证高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#xff0c;起初…

大二网页制作实习总结

整体流程 目标确立 第一天讨论确定下要做的内容&#xff0c;打算制作传统节日相关的。 因为需要分工合作&#xff0c;使用的工具也都不同&#xff0c;所以不能使用脚手架和webpack来工程化开发。 搭建的目录结构如下&#xff1a; 每个文件夹内留出一个index.html与其他模块…

机器学习之线性规划原理详解、公式推导(手推)、以及简单实例

1. 原理详解 1.1. 线性回归 假设一个空间中有一堆散点&#xff0c;线性回归的目的就是希望用一条直线&#xff0c;最大程度地“概括”这些散点。它不要求经过每一个散点&#xff0c;但是希望能考虑到每个散点的特点。按照西瓜书的例子就是&#xff0c;好瓜的评判标准y可以由xi…

为什么 JavaScript 采用原型?

为什么 JavaScript 采用原型?Photo by 卡米拉巴塔尼 on 不飞溅JavaScript 是一种基于原型的语言。自从我第一次开始学习 JavaScript 以来,我一直在乏味地听到这个故事。那么,为什么 JavaScript 会采用原型呢?我将尝试总结我对采用我发现的原型的原因的猜测。 1. JavaScri…