MST

星途 面试题库

面试题:TypeScript断言函数错误处理的优化与最佳实践

在一个大型TypeScript项目中,存在多种不同类型的API请求函数,每个函数都需要对返回数据进行断言验证并处理错误。现在要求设计一套通用的断言函数错误处理机制,不仅要高效地处理不同类型数据的验证和错误抛出,还要考虑错误的集中管理和错误信息的国际化支持。请阐述你的设计思路,并给出关键代码示例。
28.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 通用断言函数:创建一系列通用的断言函数,用于验证不同类型的数据。例如,验证是否为数字、字符串、对象等。这些函数可以接收数据和错误信息模板作为参数,当验证失败时,根据错误信息模板抛出带有国际化支持的错误。
  2. 错误集中管理:定义一个错误类型枚举,将所有可能的错误类型列举出来。同时,创建一个错误信息映射表,根据不同的错误类型和语言环境,提供相应的错误信息。
  3. 国际化支持:引入国际化库(如 i18next),在项目初始化时配置语言环境。断言函数在抛出错误时,根据当前语言环境从错误信息映射表中获取对应的错误信息。
  4. 错误处理中间件:在API请求函数外层包裹一个错误处理中间件,该中间件负责捕获断言函数抛出的错误,并进行统一处理,如记录错误日志、返回合适的HTTP状态码等。

关键代码示例

  1. 定义错误类型枚举
enum ErrorType {
  INVALID_NUMBER = 'INVALID_NUMBER',
  INVALID_STRING = 'INVALID_STRING',
  INVALID_OBJECT = 'INVALID_OBJECT'
}
  1. 错误信息映射表
const errorMessageMap: { [key in ErrorType]: { [locale: string]: string } } = {
  [ErrorType.INVALID_NUMBER]: {
    en: 'The value is not a valid number',
    zh: '该值不是有效的数字'
  },
  [ErrorType.INVALID_STRING]: {
    en: 'The value is not a valid string',
    zh: '该值不是有效的字符串'
  },
  [ErrorType.INVALID_OBJECT]: {
    en: 'The value is not a valid object',
    zh: '该值不是有效的对象'
  }
};
  1. 通用断言函数
import i18next from 'i18next';

function assertNumber(value: any, errorType: ErrorType) {
  if (typeof value!== 'number') {
    const errorMessage = errorMessageMap[errorType][i18next.language];
    throw new Error(errorMessage);
  }
}

function assertString(value: any, errorType: ErrorType) {
  if (typeof value!=='string') {
    const errorMessage = errorMessageMap[errorType][i18next.language];
    throw new Error(errorMessage);
  }
}

function assertObject(value: any, errorType: ErrorType) {
  if (typeof value!== 'object' || Array.isArray(value)) {
    const errorMessage = errorMessageMap[errorType][i18next.language];
    throw new Error(errorMessage);
  }
}
  1. API请求函数示例
async function apiRequest() {
  try {
    const response = await fetch('/api/data');
    const data = await response.json();

    assertObject(data, ErrorType.INVALID_OBJECT);
    assertNumber(data.id, ErrorType.INVALID_NUMBER);
    assertString(data.name, ErrorType.INVALID_STRING);

    // 处理数据
    console.log('Processed data:', data);
  } catch (error) {
    // 错误处理中间件可在此处进行统一处理
    console.error('Error:', error.message);
  }
}
  1. 错误处理中间件示例(简单模拟)
function errorHandlingMiddleware(func: () => Promise<void>) {
  return async () => {
    try {
      await func();
    } catch (error) {
      // 记录错误日志
      console.error('Middleware caught error:', error.message);
      // 返回合适的HTTP状态码(这里简单模拟)
      // 例如,如果是无效数据错误,返回400 Bad Request
      // 实际应用中可根据错误类型设置不同状态码
      // res.status(400).send(error.message);
    }
  };
}

// 使用中间件
const apiRequestWithMiddleware = errorHandlingMiddleware(apiRequest);
apiRequestWithMiddleware();