TypeScript 教程(九):类型声明文件与异步编程

目录

  • 前言
  • 回顾装饰器与高级类型操控
  • 1. 类型声明文件
    • a. 什么是类型声明文件(.d.ts)
    • b. 编写和使用类型声明文件
  • 2. 异步编程
    • a. Promise 类型
    • b. async/await
    • c. 异步迭代器
  • 3. 并行执行与错误处理
    • a. Promise.all
    • b. Promise.race
    • c. 错误处理
  • 结语

前言

在前几章中,我们学习了 TypeScript 的基础知识、函数与对象类型、接口与类、泛型编程、模块与命名空间、以及装饰器与高级类型操控。在本章中,我们将深入探讨 TypeScript 中的类型声明文件与异步编程。类型声明文件(.d.ts 文件)用于为 JavaScript 库提供类型定义,从而使 TypeScript 能够进行类型检查和自动补全。异步编程则包括 Promise、async/await 和异步迭代器等概念,用于处理异步操作。

系列文章列表

  • TypeScript 教程(一):安装和tsc编译
  • TypeScript 教程(二):类型与类型注解
  • TypeScript 教程(三):函数与对象类型
  • TypeScript 教程(四):高级类型与类型操作
  • TypeScript 教程(五):接口与类
  • TypeScript 教程(六):泛型编程
  • TypeScript 教程(七):模块与命名空间
  • TypeScript 教程(八):装饰器与高级类型操控
  • TypeScript 教程(九):类型声明文件与异步编程
  • TypeScript 教程(十):项目配置、代码质量与前端框架集成

回顾装饰器与高级类型操控

在上一章中,我们学习了以下内容:

  • 装饰器:包括类装饰器、方法装饰器、访问器装饰器、属性装饰器和参数装饰器。
  • 高级类型操控:包括类型别名、映射类型、条件类型和工具类型,日志装饰器和自定义工具类型。

在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


1. 类型声明文件

a. 什么是类型声明文件(.d.ts)

类型声明文件用于描述现有 JavaScript 代码的类型结构,使 TypeScript 能够进行类型检查和代码提示。

// math.d.ts
declare module "math" {export function add(x: number, y: number): number;export const PI: number;
}

b. 编写和使用类型声明文件

你可以手动编写类型声明文件,也可以从 DefinitelyTyped 项目中获取。

// 使用 math.d.ts
import { add, PI } from "math";console.log(add(5, 10)); // 15
console.log(PI); // 3.14

2. 异步编程

a. Promise 类型

Promise 用于处理异步操作,表示一个异步操作的最终完成(或失败)及其结果值。

function fetchData(url: string): Promise<string> {return new Promise((resolve, reject) => {setTimeout(() => {if (url) {resolve(`Data from ${url}`);} else {reject("Invalid URL");}}, 1000);});
}fetchData("https://example.com").then(data => console.log(data)) // "Data from https://example.com".catch(error => console.error(error));

b. async/await

asyncawait 语法使得编写异步代码更加简洁和易读。

async function fetchDataAsync(url: string): Promise<string> {if (!url) {throw new Error("Invalid URL");}return new Promise((resolve) => {setTimeout(() => {resolve(`Data from ${url}`);}, 1000);});
}async function main() {try {const data = await fetchDataAsync("https://example.com");console.log(data); // "Data from https://example.com"} catch (error) {console.error(error);}
}main();

c. 异步迭代器

异步迭代器用于处理异步数据流。

async function* asyncGenerator() {let i = 0;while (i < 3) {yield new Promise<number>(resolve => setTimeout(() => resolve(i++), 1000));}
}async function iterateAsyncGenerator() {for await (const value of asyncGenerator()) {console.log(value); // 0, 1, 2}
}iterateAsyncGenerator();

3. 并行执行与错误处理

a. Promise.all

Promise.all 用于并行执行多个 Promise,并在所有 Promise 完成后返回结果。

const promise1 = fetchData("https://example1.com");
const promise2 = fetchData("https://example2.com");Promise.all([promise1, promise2]).then(results => {console.log(results[0]); // "Data from https://example1.com"console.log(results[1]); // "Data from https://example2.com"}).catch(error => console.error(error));

b. Promise.race

Promise.race 用于并行执行多个 Promise,并在第一个 Promise 完成后返回结果。

const slowPromise = new Promise<string>((resolve) => setTimeout(() => resolve("Slow"), 2000));
const fastPromise = new Promise<string>((resolve) => setTimeout(() => resolve("Fast"), 1000));Promise.race([slowPromise, fastPromise]).then(result => console.log(result)) // "Fast".catch(error => console.error(error));

c. 错误处理

在异步编程中,处理错误是非常重要的。

async function fetchDataWithErrorHandling(url: string): Promise<string> {try {if (!url) {throw new Error("Invalid URL");}const data = await new Promise<string>((resolve, reject) => {setTimeout(() => {resolve(`Data from ${url}`);}, 1000);});return data;} catch (error) {console.error("Error fetching data:", error);throw error;}
}fetchDataWithErrorHandling("https://example.com").then(data => console.log(data)).catch(error => console.error("Caught error:", error));

结语

通过本章的学习,你应该对 TypeScript 中的类型声明文件与异步编程有了更深入的理解。掌握这些内容将使你能够更加高效地处理异步操作,并为 JavaScript 库编写类型声明文件。在下一章中,我们将探讨 TypeScript 的项目配置、代码质量与前端框架集成,包括 tsconfig.json 高级配置、使用 Webpack 构建 TypeScript 项目、使用 Babel 编译 TypeScript、使用 ESLint 和 TSLint、使用 Prettier 格式化代码、使用 Jest 测试 TypeScript、使用 Mocha 和 Chai 测试 TypeScript、TypeScript 与 React、TypeScript 与 Angular、TypeScript 与 Vue 等内容。务必掌握好每个概念,它们将为你后续学习 TypeScript 提供坚实的基础。

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

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

相关文章

华为云.云日志服务LTS及其基本使用

云计算 云日志服务LTS及其基本使用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…

数学建模(7)——Logistic模型

一、马尔萨斯人口模型 import numpy as np import matplotlib.pyplot as plt# 初始人口 N0 100 # 人口增长率 r 0.02 # 时间段&#xff08;年&#xff09; t np.linspace(0, 200, 200)# 马尔萨斯人口模型 N N0 * np.exp(r * t)# 绘图 plt.plot(t, N, labelPopulation) plt.…

图片转pdf的软件有哪些?这几种转换工具了解下

在日常的办公学习中&#xff0c;图片转PDF的需求愈发普遍。不论是工作汇报、学习笔记还是生活点滴&#xff0c;我们都希望将重要的图片内容整理成易于查阅的PDF格式。那么&#xff0c;有哪些软件可以做到将图片转换成PDF格式呢&#xff1f;给大家介绍5种简单好用的转换方法&…

Linux第五节课(权限02)

1、Linux下的用户分类 root&#xff1a;超级用户普通用户&#xff1a;通过root新建的用户&#xff0c;adduser root不受权限约束&#xff1b;普通用户受权限约束&#xff1b; Linux系统中&#xff0c;所有用户都需要有密码&#xff0c;无论是root还是其他&#xff0c;即便是…

SpringBoot+ Sharding Sphere 轻松实现数据库字段加解密

一、介绍 在实际的软件系统开发过程中&#xff0c;由于业务的需求&#xff0c;在代码层面实现数据的脱敏还是远远不够的&#xff0c;往往还需要在数据库层面针对某些关键性的敏感信息&#xff0c;例如&#xff1a;身份证号、银行卡号、手机号、工资等信息进行加密存储&#xf…

优选算法之二分查找(上)

目录 一、二分查找 1.题目链接&#xff1a;704. 二分查找 2.题目描述&#xff1a; 3.算法流程&#xff1a; 4.算法代码&#xff1a; 二、在排序数组中查找元素的第一个和最后一个位置 1.题目链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 2.题目描述…

matlab2018b安装

1.可先参考这个 2.激活 按上面教程安装后&#xff0c;打开matlab 可能会出现软件激活这个界面&#xff0c;需要按如下步骤进行操作。

从理论到实践:如何用 TDengine 打造完美数据模型​

在用 TDengine 进行数据建模之前&#xff0c;我们需要回答两个关键问题&#xff1a;建模的目标用户是谁&#xff1f;他们的具体需求是什么&#xff1f;在一个典型的时序数据管理方案中&#xff0c;数据采集和数据应用是两个主要环节。如下图所示&#xff1a; 对于数据采集工程师…

Bootstrap5 Navbar多级下拉框

实现目标&#xff1a; 1、访问 Bootstrap5-navbar 2、修改dropdown为多级 <!DOCTYPE HTML> <html lang"en-US"> <head><meta charset"UTF-8"><title></title><link rel"stylesheet" href"https…

Unity DOTS中的world

Unity DOTS中的world 注册销毁逻辑自定义创建逻辑创建world创建system group插入player loopReference DOTS中&#xff0c;world是一组entity的集合。entity的ID在其自身的世界中是唯一的。每个world都拥有一个EntityManager&#xff0c;可以用它来创建、销毁和修改world中的en…

[AWS]MSK调用,报错Access denied

背景&#xff1a;首先MSK就是配置一个AWS的托管 kafka&#xff0c;创建完成之后就交给开发进行使用&#xff0c;开发通常是从代码中&#xff0c;编写AWS的access_key 和secret_key进行调用。 但是开发在进行调用的时候&#xff0c;一直报错连接失败&#xff0c;其实问题很简单&…

【机器学习】机器学习之计算学习理论--评估机器学习能够学到什么程度

引言 计算学习理论&#xff08;Computational Learning Theory&#xff0c;CLT&#xff09;是机器学习的一个分支&#xff0c;它使用数学工具来分析和理解机器学习算法的效率和可能性 计算学习理论主要关注三个核心问题&#xff1a;学习模型的表示、学习算法的效率和学习的泛化…

Matlab画不同指标的对比图

目录 一、指标名字可修改 二、模型名字可修改 三、输入数据可修改 软件用的是Matlab R2024a。 clear,clc,close all figure1figure(1); % set(figure1,Position,[300,100,800,600],Color,[1 1 1]) axes1 axes(Parent,figure1);%% Initialize data points 一、指标名字可修…

Astro 4.12 发布,新增支持服务器岛屿

近日&#xff0c;Astro 发布了最新的 4.12 版本&#xff0c;此版本包含 Server Islands&#xff08;服务器岛屿&#xff09;&#xff0c;这是 Astro 将高性能静态 HTML 和动态服务器生成的组件集成在一起的新解决方案&#xff0c;此版本还包括对分页和语法突出显示的改进。 要…

如何检查我的网站是否支持HTTPS

HTTPS是一种用于安全通信的协议&#xff0c;是HTTP的安全版本。HTTPS的主要作用在于为互联网上的数据传输提供安全性和隐私保护。通常是需要在网站安装部署SSL证书来实现网络数据加密传输&#xff0c;安全加密功能。 那么如果要检查你的网站是否支持HTTPS&#xff0c;可以看下…

C#基于SkiaSharp实现印章管理(4)

前几篇文章实现了绘制不同外形印章的功能&#xff0c;印章内部一般包含圆形、线条等形状&#xff0c;有些印章内部还有五角星&#xff0c;然后就是各种样式的文字。本文实现在印章内部绘制圆形、线条、矩形、椭圆等四种形状。   定义FigureType枚举记录印章内部形状&#xff…

数据结构——堆(C语言版)

树 树的概念&#xff1a; 树&#xff08;Tree&#xff09;是一种抽象数据结构&#xff0c;它由节点&#xff08;node&#xff09;的集合组成&#xff0c;这些节点通过边相连&#xff0c;把 节点集合按照逻辑顺序抽象成图像&#xff0c;看起来就像一个倒挂着的树&#xff0c;也…

react入门到实战-day1

这react门课我是学习b站黑马的课程&#xff0c;不是打公告哈&#xff0c;我只是过一遍&#xff0c;让自己对学过的知识有印象&#xff0c;所以笔记是有很大部分直接复制总结过来的&#xff0c;方便后面的我进行复习。如有冒犯&#xff0c;联系必删 React介绍以及创建方式 React…

基于FPGA的以太网设计(2)----以太网的硬件架构(MAC+PHY)

1、概述 以太网的电路架构一般由MAC、PHY、变压器、RJ45和传输介质组成,示意图如下所示: 需要注意的是,上图是一个简化了的模型,它描述的是两台主机之间的直接连接,但在实际应用中基本都是多台主机构成的局域网,它们之间并不直接相连,而是通过交换机Switch来进行…

JAVA开发工具IDEA如何连接操作数据库

一、下载驱动 下载地址&#xff1a;【免费】mysql-connector-j-8.2.0.jar资源-CSDN文库 二、导入驱动 鼠标右击下载到IDEA中的jar包&#xff0c;选择Add as Library选项 如图就导入成功 三、加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); 四、驱动管理…