面试题答案
一键面试设计思路
- 定义接口:使用 TypeScript 接口定义 API 请求模块核心函数接受的参数结构。对于可选参数,在接口中使用
?
标记。对于有默认值的参数,在接口定义中明确其类型和可能的默认值。例如:
interface ApiRequestConfig {
headers?: { [key: string]: string };
timeout?: number;
// 其他可选参数
}
- 核心函数设计:在核心函数定义中,将接口作为参数传入,并为可选参数设置默认值。这样既保证了类型安全,又满足了默认值的需求。
function apiRequest(url: string, config: ApiRequestConfig = {}) {
const defaultHeaders = { 'Content-Type': 'application/json' };
const headers = { ...defaultHeaders, ...config.headers };
const timeout = config.timeout || 5000;
// 实际请求逻辑
}
- 可扩展性:当需要添加新的可选参数时,只需在接口中添加新的属性,并在核心函数中进行相应处理。例如,添加一个
cache
参数来控制是否缓存请求结果:
interface ApiRequestConfig {
headers?: { [key: string]: string };
timeout?: number;
cache?: boolean;
}
function apiRequest(url: string, config: ApiRequestConfig = {}) {
const defaultHeaders = { 'Content-Type': 'application/json' };
const headers = { ...defaultHeaders, ...config.headers };
const timeout = config.timeout || 5000;
const cache = config.cache || false;
// 根据 cache 值进行相应逻辑处理
}
- 模块使用:不同模块在调用
apiRequest
函数时,根据自身需求传入不同的配置参数。如果模块不需要修改默认值,可以传入空对象。
// 模块 A 保持默认配置
apiRequest('/api/data', {});
// 模块 B 修改请求头
apiRequest('/api/data', { headers: { 'Authorization': 'Bearer token' } });
// 模块 C 修改超时时间
apiRequest('/api/data', { timeout: 10000 });
实际项目经验举例
在一个电商项目中,有多个模块需要调用商品 API 获取商品信息。API 请求模块的 fetchProduct
函数接受配置参数。
- 接口定义:
interface ProductRequestConfig {
headers?: { [key: string]: string };
timeout?: number;
language?: string; // 新增参数,用于获取不同语言的商品描述
}
- 核心函数:
function fetchProduct(productId: string, config: ProductRequestConfig = {}) {
const defaultHeaders = { 'Content-Type': 'application/json' };
const headers = { ...defaultHeaders, ...config.headers };
const timeout = config.timeout || 8000;
const language = config.language || 'en';
// 发起请求获取商品信息,根据 language 参数处理不同语言描述
}
- 模块调用:
// 商品列表模块,保持默认配置
fetchProduct('12345', {});
// 商品详情模块,修改语言为中文
fetchProduct('12345', { language: 'zh' });
通过这种方式,利用 TypeScript 的可选参数和默认参数,实现了代码的可维护性、可扩展性以及类型安全性。