MST
星途 面试题库

面试题:TypeScript 可选参数与默认参数在大型项目架构设计中的考量

在一个大型前端项目中,有多个模块依赖于一个基础的 API 请求模块。假设 API 请求模块的核心函数接受多个参数,其中一些参数是可选的且有默认值,这些参数用于配置请求的各种设置,如请求头、超时时间等。随着项目的发展,不同模块对请求的配置需求变得复杂多样,有些模块可能需要修改默认参数,有些模块可能需要添加新的可选参数。请从架构设计的角度,阐述如何合理地利用 TypeScript 的可选参数和默认参数,同时保证代码的可维护性、可扩展性以及类型安全性。可以结合实际项目经验举例说明具体的设计思路和实现方式。
27.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义接口:使用 TypeScript 接口定义 API 请求模块核心函数接受的参数结构。对于可选参数,在接口中使用 ? 标记。对于有默认值的参数,在接口定义中明确其类型和可能的默认值。例如:
interface ApiRequestConfig {
  headers?: { [key: string]: string };
  timeout?: number;
  // 其他可选参数
}
  1. 核心函数设计:在核心函数定义中,将接口作为参数传入,并为可选参数设置默认值。这样既保证了类型安全,又满足了默认值的需求。
function apiRequest(url: string, config: ApiRequestConfig = {}) {
  const defaultHeaders = { 'Content-Type': 'application/json' };
  const headers = { ...defaultHeaders, ...config.headers };
  const timeout = config.timeout || 5000;
  // 实际请求逻辑
}
  1. 可扩展性:当需要添加新的可选参数时,只需在接口中添加新的属性,并在核心函数中进行相应处理。例如,添加一个 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 值进行相应逻辑处理
}
  1. 模块使用:不同模块在调用 apiRequest 函数时,根据自身需求传入不同的配置参数。如果模块不需要修改默认值,可以传入空对象。
// 模块 A 保持默认配置
apiRequest('/api/data', {});

// 模块 B 修改请求头
apiRequest('/api/data', { headers: { 'Authorization': 'Bearer token' } });

// 模块 C 修改超时时间
apiRequest('/api/data', { timeout: 10000 });

实际项目经验举例

在一个电商项目中,有多个模块需要调用商品 API 获取商品信息。API 请求模块的 fetchProduct 函数接受配置参数。

  1. 接口定义
interface ProductRequestConfig {
  headers?: { [key: string]: string };
  timeout?: number;
  language?: string; // 新增参数,用于获取不同语言的商品描述
}
  1. 核心函数
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 参数处理不同语言描述
}
  1. 模块调用
// 商品列表模块,保持默认配置
fetchProduct('12345', {});

// 商品详情模块,修改语言为中文
fetchProduct('12345', { language: 'zh' });

通过这种方式,利用 TypeScript 的可选参数和默认参数,实现了代码的可维护性、可扩展性以及类型安全性。