目录
- 前言
- 回顾装饰器与高级类型操控
- 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
async
和 await
语法使得编写异步代码更加简洁和易读。
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 提供坚实的基础。