如何以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
相关产品推荐
相关产品推荐

