MST

星途 面试题库

面试题:TypeScript类型守卫在异步错误处理和类型缩小中的实践

编写一个包含多个异步操作的TypeScript函数`processData`,在这个过程中,使用类型守卫来处理可能出现的不同类型错误(如网络错误、数据格式错误等),并且通过类型守卫在捕获错误时缩小类型范围,使得错误处理更加精准,最终返回处理后的结果。请给出完整的代码实现,包括相关类型定义和函数逻辑。
31.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义网络错误类型
class NetworkError extends Error {
    constructor(message: string) {
        super(message);
        this.name = 'NetworkError';
    }
}

// 定义数据格式错误类型
class DataFormatError extends Error {
    constructor(message: string) {
        super(message);
        this.name = 'DataFormatError';
    }
}

// 模拟异步操作,可能抛出网络错误
async function fetchData(): Promise<string> {
    // 这里简单模拟网络错误
    if (Math.random() > 0.5) {
        throw new NetworkError('Network connection failed');
    }
    return '{"key": "value"}';
}

// 模拟数据解析操作,可能抛出数据格式错误
function parseData(data: string): { key: string } {
    try {
        return JSON.parse(data) as { key: string };
    } catch (error) {
        throw new DataFormatError('Data format is incorrect');
    }
}

// 主函数
async function processData(): Promise<{ key: string }> {
    try {
        const fetchedData = await fetchData();
        return parseData(fetchedData);
    } catch (error) {
        if (error instanceof NetworkError) {
            console.error('Network error occurred:', error.message);
            throw error;
        } else if (error instanceof DataFormatError) {
            console.error('Data format error occurred:', error.message);
            throw error;
        } else {
            console.error('Unexpected error occurred:', error);
            throw error;
        }
    }
}

// 测试
processData().then(result => {
    console.log('Processed result:', result);
}).catch(error => {
    console.error('Error in processing:', error);
});