You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以DRY方式编写带默认值命名参数的TypeScript函数?

如何减少TypeScript带默认值命名参数函数的重复代码?

我正在编写一个带默认值的命名参数函数,JavaScript版本如下:

function makeCake(params) {
  const {
    sugarCups = 1,
    flourCups = 1.5,
    butterCups = 0.5,
    milkCups = 0.5,
    vanillaTsps = 2,
    bakingPoweredTsps = 1.5,
    eggs = 2,
  } = params;
  // ... 函数逻辑
}

转成带文档注释的TypeScript版本时,传统写法会大量重复:每个参数要手动声明类型、写两次默认值、重复编写注释,完全违背*DRY(不要重复自己)*原则:

/**
 * 制作蛋糕
 * @param params
 * @param params.sugarCups (默认值 1)
 * @param params.flourCups (默认值 1.5)
 * @param params.butterCups (默认值 0.5)
 * @param params.milkCups (默认值 0.5)
 * @param params.vanillaTsps (默认值 2)
 * @param params.bakingPoweredTsps (默认值 1.5)
 * @param params.eggs (默认值 2)
 */
function makeCake(params: {
    sugarCups?: number,
    flourCups?: number,
    butterCups?: number,
    milkCups?: number,
    vanillaTsps?: number,
    bakingPoweredTsps?: number,
    eggs?: number,
} = {}) {
  const {
    sugarCups = 1,
    flourCups = 1.5,
    butterCups = 0.5,
    milkCups = 0.5,
    vanillaTsps = 2,
    bakingPoweredTsps = 1.5,
    eggs = 2,
  } = params;
  // ... 函数逻辑
}

我尝试提取默认值对象,用Partial<typeof kCakeDefaults>避免重复类型定义,但代码量没明显减少,文档注释还是要重复编写:

const kCakeDefaults = {
  sugarCups: 1,
  flourCups: 1.5,
  butterCups: 0.5,
  milkCups: 0.5,
  vanillaTsps: 2,
  bakingPoweredTsps: 1.5,
  eggs: 2,
};

/**
 * 制作蛋糕
 * @param params
 * @param params.sugarCups (默认值 1)
 * @param params.flourCups (默认值 1.5)
 * @param params.butterCups (默认值 0.5)
 * @param params.milkCups (默认值 0.5)
 * @param params.vanillaTsps (默认值 2)
 * @param params.bakingPoweredTsps (默认值 1.5)
 * @param params.eggs (默认值 2)
 */
function makeCake(params: Partial<typeof kCakeDefaults> = {}) {
  const {
    sugarCups,
    flourCups,
    butterCups,
    milkCups,
    vanillaTsps,
    bakingPoweredTsps,
    eggs,
  } = { ...kCakeDefaults, ...params };
  return sugarCups + flourCups + butterCups + milkCups + vanillaTsps + bakingPoweredTsps + eggs;
}

有没有方法能大幅减少这类重复代码?


优化方案1:参数解构+自动类型推断

直接在函数参数中完成解构并设置默认值,TypeScript会自动根据默认值推断参数类型,无需手动声明接口或Partial类型:

/**
 * 制作蛋糕
 * @param params.sugarCups 糖的杯数 (默认值 1)
 * @param params.flourCups 面粉的杯数 (默认值 1.5)
 * @param params.butterCups 黄油的杯数 (默认值 0.5)
 * @param params.milkCups 牛奶的杯数 (默认值 0.5)
 * @param params.vanillaTsps 香草精的茶匙数 (默认值 2)
 * @param params.bakingPoweredTsps 泡打粉的茶匙数 (默认值 1.5)
 * @param params.eggs 鸡蛋个数 (默认值 2)
 */
function makeCake({
  sugarCups = 1,
  flourCups = 1.5,
  butterCups = 0.5,
  milkCups = 0.5,
  vanillaTsps = 2,
  bakingPoweredTsps = 1.5,
  eggs = 2,
} = {}) {
  // 直接使用变量,无需二次解构
  return sugarCups + flourCups + butterCups + milkCups + vanillaTsps + bakingPoweredTsps + eggs;
}

这种写法里,默认值只写一次,类型由TypeScript自动推断,参数解构一步到位,大幅减少了重复代码。

优化方案2:复用默认值对象+工具类型

如果需要在其他地方复用默认值或参数类型,可以提取默认值对象,结合类型推断和工具类型强化约束:

const kCakeDefaults = {
  sugarCups: 1,
  flourCups: 1.5,
  butterCups: 0.5,
  milkCups: 0.5,
  vanillaTsps: 2,
  bakingPoweredTsps: 1.5,
  eggs: 2,
};

// 自动推断完整参数类型,可复用
type CakeParams = typeof kCakeDefaults;

/**
 * 制作蛋糕
 * @param params 蛋糕配料参数,所有字段可选,未传则使用默认值
 * @param params.sugarCups 糖的杯数 (默认值 1)
 * @param params.flourCups 面粉的杯数 (默认值 1.5)
 * @param params.butterCups 黄油的杯数 (默认值 0.5)
 * @param params.milkCups 牛奶的杯数 (默认值 0.5)
 * @param params.vanillaTsps 香草精的茶匙数 (默认值 2)
 * @param params.bakingPoweredTsps 泡打粉的茶匙数 (默认值 1.5)
 * @param params.eggs 鸡蛋个数 (默认值 2)
 */
function makeCake(params: Partial<CakeParams> = {}) {
  const ingredients = { ...kCakeDefaults, ...params };
  // 直接使用ingredients对象或解构变量
  return Object.values(ingredients).reduce((sum, val) => sum + val, 0);
}

这里类型CakeParams由默认值对象自动生成,无需手动编写每个字段类型;默认值只维护一处,后续修改只需更新kCakeDefaults即可。

文档注释简化技巧

文档注释的重复目前无法通过原生TypeScript语法完全消除,但可以通过以下方式简化:

  • 注释中仅标注默认值和字段说明,无需重复类型(编辑器会自动显示TypeScript推断的类型)
  • 使用编辑器插件(如VS Code的Document This)自动生成注释,减少手动编写量

内容的提问来源于stack exchange,提问作者samanthaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:37:04