MST

星途 面试题库

面试题:TypeScript 异步编程中复杂场景下的类型安全设计

假设有一个场景,需要从多个 API 端点获取数据,这些 API 调用之间存在依赖关系(例如,第二个 API 需要第一个 API 的返回值作为参数),并且所有 API 调用都需要保证类型安全。使用 TypeScript 设计一个模块,该模块包含处理这些 API 调用的函数,要考虑如何优雅地管理异步操作,确保类型安全,处理错误,并且代码具有良好的可维护性和扩展性。请详细描述设计思路并给出关键代码示例。
31.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 类型定义:首先为每个 API 的输入和输出定义明确的 TypeScript 类型,以确保类型安全。
  2. 异步操作管理:使用 async/await 来处理异步操作,这样代码看起来更像是同步代码,提高可读性。同时结合 Promise 来处理多个 API 调用之间的依赖关系。
  3. 错误处理:使用 try/catch 块来捕获 API 调用过程中可能出现的错误,并进行适当的处理。
  4. 可维护性和扩展性:将每个 API 调用封装成独立的函数,这样如果 API 发生变化,只需要修改对应的函数。如果有新的 API 依赖,也容易在现有代码基础上进行扩展。

关键代码示例

// 定义API输入输出类型
type Api1Response = {
    data: string;
};

type Api2Request = {
    param: string;
};

type Api2Response = {
    result: number;
};

// 模拟API调用函数,这里用setTimeout模拟异步操作
async function api1(): Promise<Api1Response> {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve({ data: 'example data' });
        }, 1000);
    });
}

async function api2(request: Api2Request): Promise<Api2Response> {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve({ result: request.param.length });
        }, 1000);
    });
}

// 处理多个API调用的函数
async function fetchData(): Promise<Api2Response> {
    try {
        const api1Result = await api1();
        const api2Request: Api2Request = { param: api1Result.data };
        const api2Result = await api2(api2Request);
        return api2Result;
    } catch (error) {
        // 处理错误
        console.error('Error fetching data:', error);
        throw error;
    }
}

// 使用示例
fetchData().then(result => {
    console.log('Final result:', result);
}).catch(error => {
    console.error('An error occurred:', error);
});