面试题答案
一键面试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进行类型检查和相应处理
实现思路
- 类型守卫:使用类型守卫来确保传入的参数是enum中的合法值。
- 映射类型:这里不需要映射类型,主要通过类型断言和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类型定义在不同模块间的一致性
实现思路
- 集中定义:将enum类型定义在一个单独的模块中,各个模块通过导入该模块来使用enum。
- 版本控制:使用版本控制系统(如Git)来跟踪enum定义的变化。
- 自动化工具:可以使用自动化工具(如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
文件,其他模块会自动获取到更新后的定义。