2024年珠峰TypeScript特训营(高の青)

2024-08-19 10:48:21 浏览数 (1)

下面我们将使用 TypeScript 创建一个简化版的 Axios 库。Axios 是一个流行的 HTTP 客户端库,它允许开发者轻松地发送请求并处理响应。我们将实现基本的 GET 和 POST 请求功能。

1. 项目初始化

首先,创建一个新的项目文件夹并初始化一个 Node.js 项目:

代码语言:txt复制
mkdir my-axios
cd my-axios
npm init -y

然后,安装 TypeScript 及其类型定义:

代码语言:txt复制
npm install typescript --save-dev
npx tsc --init

接下来,安装 Axios 作为依赖(可选,仅用于测试):

代码语言:txt复制
npm install axios

2. 创建 Axios 类

在项目根目录下,创建一个 src 文件夹,并在其中创建一个名为 MyAxios.ts 的文件。我们将开始实现 Axios 类的基本结构。

代码语言:txt复制
// src/MyAxios.ts
export class MyAxios {
    constructor() {}

    // ... 这里将添加请求方法
}

3. 实现 GET 请求

接下来,我们将在 MyAxios 类中实现一个简单的 GET 请求方法。

代码语言:txt复制
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';

export class MyAxios {
    constructor() {}

    async get<T>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {
        try {
            const response = await axios.get<T>(url, config);
            return response;
        } catch (error) {
            throw this.handleError(error);
        }
    }

    private handleError(error: any): Error {
        // 处理错误
        if (axios.isAxiosError(error)) {
            return new Error(error.message);
        }
        return new Error('Unknown error');
    }
}

4. 实现 POST 请求

接下来,我们添加一个 POST 请求的方法。

代码语言:txt复制
async post<T>(url: string, data: any, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {
    try {
        const response = await axios.post<T>(url, data, config);
        return response;
    } catch (error) {
        throw this.handleError(error);
    }
}

将完整类更新为:

代码语言:txt复制
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';

export class MyAxios {
    constructor() {}

    async get<T>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {
        try {
            const response = await axios.get<T>(url, config);
            return response;
        } catch (error) {
            throw this.handleError(error);
        }
    }

    async post<T>(url: string, data: any, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {
        try {
            const response = await axios.post<T>(url, data, config);
            return response;
        } catch (error) {
            throw this.handleError(error);
        }
    }

    private handleError(error: any): Error {
        if (axios.isAxiosError(error)) {
            return new Error(error.message);
        }
        return new Error('Unknown error');
    }
}

5. 错误处理

我们在 handleError 方法中进行了简单的错误处理。如果请求失败,我们会返回一个包含错误消息的 Error 对象。

6. 测试我们的库

src 文件夹下创建一个 index.ts 文件,用于测试我们的库。

代码语言:txt复制
// src/index.ts
import { MyAxios } from './MyAxios';

const myAxios = new MyAxios();

async function test() {
    try {
        const response = await myAxios.get('https://jsonplaceholder.typicode.com/posts');
        console.log(response.data);
        
        const postResponse = await myAxios.post('https://jsonplaceholder.typicode.com/posts', {
            title: 'foo',
            body: 'bar',
            userId: 1,
        });
        console.log(postResponse.data);
    } catch (error) {
        console.error(error);
    }
}

test();

编译与运行

最后,在项目根目录下编译 TypeScript 代码并运行:

代码语言:txt复制
npx tsc
node dist/index.js

你应该能看到来自 JSONPlaceholder 的 GET 和 POST 请求的输出。

0 人点赞