TypeScript 学习笔记(Day4)

news2024/11/19 15:32:48

「写在前面」

本文为 b 站黑马程序员 TypeScript 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容:
1. TypeScript 学习笔记(Day1)
2. TypeScript 学习笔记(Day2)
3. TypeScript 学习笔记(Day3)


目录

  • 5 TypeScript 类型声明文件
    • 5.1 TS 中的两种文件类型
    • 5.2 类型声明文件的使用说明

5 TypeScript 类型声明文件

P69:https://www.bilibili.com/video/BV14Z4y1u7pi?p=69

今天几乎所有的 JavaScript 应用都会引入许多第三方库来完成任务需求。
这些第三方库不管是否是用 TS 编写的,最终都要编译成 JS 代码,才能发布给开发者使用。
我们知道是 TS 提供了类型,才有了代码提示和类型保护等机制。
但在项目开发中使用第三方库时,你会发现它们几乎都有相应的 TS 类型,这些类型是怎么来的呢?类型声明文件
类型声明文件:用来为已存在的 JS 库提供类型信息
这样在 TS 项目中使用这些库时,就像用 TS 一样,都会有代码提示、类型保护等机制了。

5.1 TS 中的两种文件类型

P70:https://www.bilibili.com/video/BV14Z4y1u7pi?p=70

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 文件。

5.2 类型声明文件的使用说明

P71:https://www.bilibili.com/video/BV14Z4y1u7pi?p=71

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

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

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

使用已有的类型声明文件:1 内置类型声明文件 2 第三方库的类型声明文件。

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

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

alt

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

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

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

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

P72:https://www.bilibili.com/video/BV14Z4y1u7pi?p=72

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

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

  1. 库自带类型声明文件:比如,axios。
alt

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

  1. 由 DefinitelyTyped 提供。 DefinitelyTyped 是一个 github 仓库, 用来提供高质量 TypeScript 类型声明
    可以通过 npm/yarn 来下载该仓库提供的 TS 类型声明包,这些包的名称格式为:@types/*。
    比如,@types/react、@types/lodash 等。
    说明:在实际项目开发时,如果你使用的第三方库没有自带的声明文件,VSCode 会给出明确的提示。
alt

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

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

P73:https://www.bilibili.com/video/BV14Z4y1u7pi?p=73

创建自己的类型声明文件:1 项目内共享类型 2 为已有 JS 文件提供类型声明

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

操作步骤:

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

P74:https://www.bilibili.com/video/BV14Z4y1u7pi?p=74

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

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

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

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

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

P75:https://www.bilibili.com/video/BV14Z4y1u7pi?p=75

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

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

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

  1. 对于 type、interface 等这些明确就是 TS 类型的(只能在 TS 中使用的),可以省略 declare 关键字。
  2. 对于 let、function 等具有双重含义(在 JS、TS 中都能用),应该使用 declare 关键字,明确指定此处用于类型声明。

「结束」
alt

本文由 mdnice 多平台发布

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

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

相关文章

Three.js学习2:页面引入 Three.js

一、关于 Three.js 的版本 随着页面3D化应用越来越多,近两年 Three.js 处于飞速发展之中。现在 Three.js 几乎每个月都会发布一个新的版本,会增加新的 API,废掉一些旧的功能之类的。 可以从 Three.js 官网 Three.js – JavaScript 3D Libra…

web漏洞扫码工具

Invicti 是一种自动化但完全可配置的 Web 应用程序安全扫描程序,使您能够扫描网站、Web 应用程序和 Web 服务,并识别安全漏洞。Invicti 可以扫描所有类型的 Web 应用程序,无论其构建平台或语言。 Invicti 是唯一一款能够以只读且安全的方式自…

Next.js初识

Next.js初识 Next.js:这是一个用于生产环境的React 框架(国外用的比较多)。 Next.js 为您提供生产环境所需的所有功能以及最佳的开发体验:包括静态及服务器端融合渲染、 支持 TypeScript、智能化打包、 路由预取等功能 无需任何配…

c#的反汇编对抗

文章目录 前记nim攻防基础FFI内存加载加解密、编码 后记C#类型转换表nim基础 前记 随便编写一个c#调用winapi并用vs生成dll,同时用csc生成exe using System; using System.Runtime.InteropServices; namespace coleak {class winfun{[DllImport("User32.dll")]publ…

【JavaEE进阶】 图书管理系统开发日记——叁

🌴前言 在前面我们实现了用户登录的接口。现在我们来实现图书列表展示页面。 🎋数据准备 创建图书表,并初始化数据 -- 图书表 DROP TABLE IF EXISTS book_info; CREATE TABLE book_info (id INT ( 11 ) NOT NULL AUTO_INCREMENT,book_nam…

【数据开发】pyspark入门与RDD编程

【数据开发】pyspark入门与RDD编程 文章目录 1、pyspark介绍2、RDD与基础概念3、RDD编程3.1 Transformation/Action3.2 数据开发流程与环节 1、pyspark介绍 pyspark的用途 机器学习专有的数据分析。数据科学使用Python和支持性库的大数据。 spark与pyspark的关系 spark是一…

CMake Msys2 搭配vscode

(一)MSYS2介绍 MSYS2(Minimal SYStem 2)是一个集成了大量的GNU工具链、工具和库的开源软件包集合。它提供了一个类似于Linux的shell环境,可以在Windows系统中编译和运行许多Linux应用程序和工具。 MSYS2基于MinGW-w64平台,提供了…

分布式事务 seata+nacos 部署

分布式事务 seatanacos 部署 一、下载seata二、解压配置三、导入数据库四、nacos配置五、配置要引入事务的模块的配置文件六、启动七、测试 这里使用的版本: nacos:2.0.4 seata:1.5.2 seata官方地址:https://seata.apache.org/zh-…

unity addressables 加载资源和场景 显示进度条(主要用于WebGL)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、addressables是什么?二、导入Addressables三、创建Addressables Settings 资产包管理四、资源打包五、环境模拟六、查看重复资源七、选择Bundle…

WordPress主题YIA的文章页评论内容为什么没有显示出来?

有些WordPress站长使用YIA主题后,在YIA主题设置的“基本”中没有开启“一键关闭评论功能”,而且文章也是允许评论的,但是评论框却不显示,最关键的是文章原本就有的评论内容也不显示,这是为什么呢? 根据YIA主…

【毕业日记】2024.01 - 慢下来,静待花开

转眼距离930离开鹅厂已经120天了,我是很能拖延的,或者是很懂自我麻痹的,这三个多月,一直想要写点东西纪念,一直拖一直拖一直拖…… 疫情这几年经济下行里裁员是个茶余饭后“嬉笑”之余经常被提起的词,部门滚…

python 实现 macOS状态栏 网速实时显示

安装依赖包: pip install pillow psutil rumpsnetSpeedApp.py from PIL import Image, ImageDraw, ImageFont import psutil import rumpsclass NetSpeedApp(rumps.App):def __init__(self):super(NetSpeedApp, self).__init__("NetSpeed")self.titlese…

Node需要了解的知识

Node能执行javascript的原因。 浏览器之所以能执行Javascript代码,因为内部含有v8引擎。Node.js基于v8引擎封装,因此可以执行javascript代码。Node.js环境没有DOM和BOM。DOM能访问HTML所有的节点对象,BOM是浏览器对象。但是node中提供了cons…

Postgres与DynamoDB:选择哪个数据库

启动新项目时需要做出的决定之一是使用哪个数据库。如果您使用的是Django这样的包含电池的框架,那么没有理由再三考虑。选择一个受支持的数据库引擎,就可以了。另一方面,如果你使用像FastAPI或Flask这样的微框架,你需要自己做出这…

手把手教你搭建属于自己的网站(获取被动收入),无需服务器,使用github托管

大家好,我是亚洲著名程序员青松,本次教大家如何搭建一个属于自己的网站。 下面是我自己搭建的一个网站,是一个网址导航网站。托管在了github上面,目前已经运营了三个月,每天的访问量大约有100ip左右。 下图是在51.la上…

一键部署FC超级马里奥web游戏

效果展示 安装 拉取镜像 #拉取镜像 docker pull stayhungrystayfoolish666/mario #创建并启动容器 docker run -d -p 10034:8080 --name maliao --restartalways stayhungrystayfoolish666/mario:latest 使用 浏览器打开 http://你的ip:10034/

微信小程序 安卓/IOS兼容问题

一、背景 在开发微信小程序时,不同的手机型号会出现兼容问题,特此记录一下 二、安卓/IOS兼容问题总结 2.1、new Date()时间转换格式时,IOS不兼容 问题:在安卓中时间格式2024-1-31 10:10:10,但是在iOS中是不支持 &q…

基于FFT + CNN - BiGRU-Attention 时域、频域特征注意力融合的电能质量扰动识别模型

目录 往期精彩内容: 引言 1 快速傅里叶变换FFT原理介绍 第一步,导入部分数据,扰动信号可视化 第二步,扰动信号经过FFT可视化 2 电能质量扰动数据的预处理 2.1 导入数据 第一步,按照公式模型生成单一信号 2.2 …

JavaScript基础五对象 内置对象 Math.random()

内置对象-生成任意范围随机数 Math.random() 随机数函数, 返回一个0 - 1之间,并且包括0不包括1的随机小数 [0, 1) 如何生成0-10的随机数呢? Math.floor(Math.random() * (10 1)) 放大11倍再向下取整 如何生成5-10的随机数&…

wespeaker项目grpc-java客户端开发

非常重要的原始参考资料: 链接: triton-inference-server/client github/grpc java ps: 使用grpc协议的其它项目python/go可以参考git hub目录client/tree/main/src/grpc_generated下的其它项目 其它链接: 想要系统了解triton-inference-ser…