目录
- 前言
- 回顾装饰器与高级类型操控
- 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
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 提供坚实的基础。