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

news2024/11/16 0:39:44

目录

  • 前言
  • 回顾装饰器与高级类型操控
  • 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 和异步迭代器等概念,用于处理异步操作。

  • TS 入门(一):TypeScript 简介与安装
  • TS 入门(二):Typescript类型与类型注解
  • TS 入门(三):Typescript函数与对象类型
  • TS 入门(四):TypeScript 高级类型与类型操作
  • TS 入门(五):TypeScript接口与类
  • TS 入门(六):TypeScript泛型编程
  • TS 入门(七):TypeScript模块与命名空间
  • TS 入门(八):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.coloradmin.cn/o/1933710.html

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

相关文章

前端JS特效第44集:JS动态波浪文字动画显示特效

JS动态波浪文字动画显示特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compat…

AI 绘画|Midjourney设计Logo提示词

你是否已经看过许多别人分享的 MJ 咒语&#xff0c;却仍无法按照自己的想法画图&#xff1f;通过学习 MJ 的提示词逻辑后&#xff0c;你将能够更好地理解并创作自己的“咒语”。本文将详细拆解使用 MJ 设计 Logo 的逻辑&#xff0c;让你在阅读后即可轻松上手&#xff0c;制作出…

昇思25天学习打卡营第13天|LLM-基于MindSpore实现的GPT对话情绪识别

打卡 目录 打卡 预装环境 流程简述 部分执行结果演示 词向量加载过程 模型结构 模型训练过程 模型预测过程 代码 预装环境 pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.14 pip install mindnlp pip install jieba pip install spacy pip …

最优控制问题中的折扣因子

本文探讨了在线性二次型调节器&#xff08;LQR&#xff09;中引入折扣因子的重要性和方法。通过引入折扣因子&#xff0c;性能指标在无穷时间上的积分得以收敛&#xff0c;同时反映了现实问题中未来成本重要性递减的现象&#xff08;强化学习重要概念&#xff09;。详细推导了带…

AI智能名片在Web 3.0技术栈中的应用与前景研究

摘要&#xff1a;在Web 3.0的浪潮中&#xff0c;AI智能名片作为一种创新的数字工具&#xff0c;正逐步渗透到商业交流的各个层面。本文深入探讨了AI智能名片在Web 3.0技术栈中的具体应用&#xff0c;详细分析了其背后的技术支撑、应用场景、优势以及面临的挑战。通过案例分析、…

Postgresql主键自增的方法

Postgresql主键自增的方法 一.方法&#xff08;一&#xff09; 使用 serial PRIMARY KEY 插入数据 二.方法&#xff08;二&#xff09; &#x1f388;边走、边悟&#x1f388;迟早会好 一.方法&#xff08;一&#xff09; 使用 serial PRIMARY KEY 建表语句如下&#xf…

E - Count Arithmetic Subsequences (abc362)

题意&#xff1a;给定一个数组A&#xff0c;求长度为k的A的子序列中等差数列的个数。模为998244353。如果两个子序列取自不同的位置&#xff0c;即使它们作为序列是相等的&#xff0c;也是有区别的。 分析&#xff1a;设dp[i][k][d]为以i为结尾公差为d的长度为k的个数。k的范围…

Beyond Compare 4

工具推荐: —该版由zd423基于官方简体中文版便携式制作&#xff0c;完全绿色便携—原生绿色便携化&#xff08;无资源管理器扩展模块、数据保存至根目录&#xff09;—集成专业版永久授权密钥&#xff0c;彻底去主界面首页下方网络资源横幅—完全禁止自动检测升级&#xff0c;…

Java反射和动态代理用法(附10道练习题)

目录 一、什么是反射二、反射的核心接口和类三、测试代码 Bean 类和目录结构Person 类代码目录结构 四、反射的用法1. 获取 Class 对象2. 获取构造方法 Constructor 并使用3. 获取成员变量 Field 并使用4. 获取成员方法 Method 并使用 五、动态代理与反射1. 动态代理三要素&…

算法学习笔记:贪心算法

贪心算法&#xff08;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出当前看来是最好的选择&#xff0c;就能得到问题的答案。 虽然贪心算法不是对所有问题都能得到整体最优解&#xff0c;但对范围相当广的许多问题它能产生整体最优解。在一些情况…

电机线电流与转差率曲线[进行中...]

1.电机T型等效电路模型 1.1 Python代码 - 考虑转差率为负 import numpy as np import matplotlib.pyplot as plt # 设置已知参数值 rm 11.421 lm 553.9e-3 r2 7.553 l2 42.90e-3 freq_in 50# 设置频率值范围和步长 s np.linspace(-0.05, 0.05, 1000) im 380/(rm(lml2)…

PyQt弹出式抽屉窗口

代码 from enum import Enum import sys from PyQt5.Qt import *class PopupOrientation(Enum):LEFT 0TOP 1RIGHT 2BOTTOM 3class PopupMaskDialogBase(QDialog):"""带有蒙版的对话框基类"""def __init__(self, parentNone):super().__init…

FedProto:跨异构客户端的联邦原型学习(论文阅读)

题目&#xff1a;FedProto: Federated Prototype Learning across Heterogeneous Clients 网址&#xff1a;http://arxiv.org/abs/2105.00243 摘要 在联邦学习(FL)中&#xff0c;当客户端知识在梯度空间中聚集时&#xff0c;客户端间的异构性通常会影响优化的收敛和泛化性能。…

携手AI人才 共赢智算未来丨誉天人工智能AI大模型首期班火热报名中

在数字化浪潮汹涌澎湃的今天&#xff0c;人工智能已成为推动社会进步与产业升级的关键力量。 回顾人工智能历史&#xff0c;自1956年诞生以来&#xff0c;历经三次发展热潮和两次低谷期。五十年代符号主义和逻辑推理的出现标志着人工智能的诞生&#xff0c;引发第一次发展浪潮&…

自动驾驶AVM环视算法–全景和标定全功能算法实现和exe测试demo

参考&#xff1a;全景和标定全功能算法实现和exe测试demo-金书世界 1、测试环境 opencv310vs2022 2、使用的编程语言 c和c 3、测试的demo的获取 更新&#xff1a;测试的exe程序&#xff0c;无需解压码就可以体验算法测试效果 百度网盘&#xff1a; 链接&#xff1a;http…

开发一个自己的chrom插件

开发一个自己的chrom插件 一、创建一个文件夹 二、配置文件manifest.json 创建名字为&#xff1a;manifest.json的配置文件&#xff0c;模板如下&#xff1a; {"manifest_version": 3,"name": "Hello World Extension","version": …

Go 语言 UUID 库 google/uuid 源码解析:UUID version7 的实现

google/uuid 库地址 建议阅读内容 在阅读此篇文章之前&#xff0c;建议先了解 UUIDv1 的构成、UUIDv4 的 API 以及掌握位运算。 了解 UUIDv1 的构成可以参考Go 语言 UUID 库 google/uuid 源码解析&#xff1a;UUID version1 的实现 或 RFC 9562。 了解 UUIDv4 的 API 可以看…

【数据结构】非线性表----树详解

树是一种非线性结构&#xff0c;它是由**n&#xff08;n>0&#xff09;**个有限结点组成一个具有层次关系的集合。具有层次关系则说明它的结构不再是线性表那样一对一&#xff0c;而是一对多的关系&#xff1b;随着层数的增加&#xff0c;每一层的元素个数也在不断变化&…

算法——双指针(day3)

611.有效三角形的个数 611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 三角形的判定很简单&#xff0c;任意两边之和大于第三边即可。按照正常情况&#xff0c;我们得判断3次才可以确认是否构成三角形。 因为c在本来就是最大的情况下与…

安全测试必学神器 --BurpSuite 安装及使用实操

BurpSuite是一款功能强大的集成化安全测试工具&#xff0c;专门用于攻击和测试Web应用程序的安全性。适合安全测试、渗透测试和开发人员使用。本篇文章基于BurpSuite安装及常用实操做详解&#xff0c;如果你是一名安全测试初学者&#xff0c;会大有收获&#xff01; 一、BurpS…