MST

星途 面试题库

面试题:TypeScript中enum类型的元编程与运行时特性

考虑如下的enum定义: ```typescript enum StatusCode { Success = 200, BadRequest = 400, Unauthorized = 401, InternalServerError = 500 } ``` 1. 在运行时,如何通过编程方式获取enum成员的名称和值的映射关系,例如生成一个对象`{200: 'Success', 400: 'BadRequest', 401: 'Unauthorized', 500: 'InternalServerError'}`。 2. 假设我们有一个函数`handleResponse`,接收一个数字类型的状态码作为参数,如何利用上述enum类型进行类型检查,并根据不同状态码进行相应处理,同时在编译时和运行时都能保证较高的性能和类型安全性?请详细说明实现思路和涉及到的TypeScript特性,包括但不限于类型守卫、映射类型等。 3. 在大型项目中,enum类型可能会在多个模块中使用,如何确保enum类型的定义在不同模块间的一致性,并且在enum成员发生变化时,能够方便地进行更新和维护,同时尽量减少对现有代码的影响?
37.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

1. 获取enum成员的名称和值的映射关系

在TypeScript中,可以通过以下方式获取enum成员的名称和值的映射关系:

enum StatusCode {
  Success = 200,
  BadRequest = 400,
  Unauthorized = 401,
  InternalServerError = 500
}

const codeToName: { [key: number]: string } = {};
Object.keys(StatusCode).forEach(key => {
  const value = StatusCode[key];
  if (typeof value === 'number') {
    codeToName[value] = key;
  }
});
console.log(codeToName);

2. 利用enum进行类型检查和相应处理

实现思路

  1. 类型守卫:使用类型守卫来确保传入的参数是enum中的合法值。
  2. 映射类型:这里不需要映射类型,主要通过类型断言和switch语句来处理不同状态码。

代码实现

enum StatusCode {
  Success = 200,
  BadRequest = 400,
  Unauthorized = 401,
  InternalServerError = 500
}

function isStatusCode(value: number): value is StatusCode {
  return Object.values(StatusCode).includes(value as StatusCode);
}

function handleResponse(statusCode: number) {
  if (isStatusCode(statusCode)) {
    switch (statusCode) {
      case StatusCode.Success:
        console.log('请求成功');
        break;
      case StatusCode.BadRequest:
        console.log('错误的请求');
        break;
      case StatusCode.Unauthorized:
        console.log('未授权');
        break;
      case StatusCode.InternalServerError:
        console.log('内部服务器错误');
        break;
    }
  } else {
    console.log('未知的状态码');
  }
}

3. 确保enum类型定义在不同模块间的一致性

实现思路

  1. 集中定义:将enum类型定义在一个单独的模块中,各个模块通过导入该模块来使用enum。
  2. 版本控制:使用版本控制系统(如Git)来跟踪enum定义的变化。
  3. 自动化工具:可以使用自动化工具(如Babel插件)在构建时对引用enum的代码进行检查和更新。

示例

假设在statusCodes.ts文件中定义enum:

export enum StatusCode {
  Success = 200,
  BadRequest = 400,
  Unauthorized = 401,
  InternalServerError = 500
}

在其他模块中导入使用:

import { StatusCode } from './statusCodes';

function someFunction() {
  const code = StatusCode.Success;
  // ...
}

这样,当enum成员发生变化时,只需要修改statusCodes.ts文件,其他模块会自动获取到更新后的定义。