MST

星途 面试题库

面试题:TypeScript断言函数错误处理的复杂场景

有一个函数`fetchUserData`,它通过异步操作(模拟为`Promise`)获取用户数据,数据格式为`{id: number; name: string; age: number}`。在数据返回后,需要使用断言函数进行数据验证,如果数据格式不正确,抛出`UserDataFormatError`错误,并将错误信息详细记录。请实现`fetchUserData`函数以及相关的错误类型和断言函数。
35.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

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

// 断言函数
function assertUserDataFormat(data: any): asserts data is { id: number; name: string; age: number } {
    if (
        typeof data === 'object' &&
        'id' in data &&
        typeof data.id === 'number' &&
        'name' in data &&
        typeof data.name ==='string' &&
        'age' in data &&
        typeof data.age === 'number'
    ) {
        return;
    }
    throw new UserDataFormatError('用户数据格式不正确');
}

// 模拟异步获取用户数据的函数
function fetchUserData(): Promise<{ id: number; name: string; age: number }> {
    return new Promise((resolve, reject) => {
        // 模拟异步操作,这里用setTimeout代替真实异步
        setTimeout(() => {
            const mockData = { id: 1, name: 'John', age: 30 }; // 假设这是获取到的数据
            try {
                assertUserDataFormat(mockData);
                resolve(mockData);
            } catch (error) {
                if (error instanceof UserDataFormatError) {
                    console.error('错误信息:', error.message);
                }
                reject(error);
            }
        }, 1000);
    });
}

你可以这样调用fetchUserData函数:

fetchUserData()
   .then(data => {
        console.log('用户数据:', data);
    })
   .catch(error => {
        console.error('获取用户数据时出错:', error);
    });