TypeScript存在可选参数时如何覆盖默认参数值
结论
你需要调整函数签名,你遇到的问题是JS/TS位置参数的固有特性导致的,这类场景下TypeScript社区通用的最佳实践是将零散的可选参数整合为配置对象。
问题原因
JS/TS的位置参数严格按照传参顺序匹配,你写MyClass.myFunc("foo", false)时,第二个参数false会被识别为param2而非param4。如果不想改签名只能手动用undefined占位:
// 可行但可读性、维护性极差,不推荐 MyClass.myFunc("foo", undefined, undefined, false)
推荐改造方案
把除了必填核心参数之外的可选参数、带默认值的参数都合并到单个配置对象中,搭配解构赋值实现默认值,写法如下:
class MyClass { static myFunc( // 第一个必填核心参数保留为位置参数 param1: string, // 所有可选参数放入配置对象 { param2, param3, // 默认值直接写在解构语句中 param4 = true }: { param2?: string param3?: string param4?: boolean // 配置对象整体默认值设为空对象,支持不传任何可选参数 } = {} ) { // 原有逻辑直接使用param1、param2、param3、param4即可 } }
改造后你需要的调用方式可以直接实现,语义也更清晰:
MyClass.myFunc("foo", { param4: false })
需要传其他可选参数时也不用关心顺序,按需传即可:
MyClass.myFunc("foo", { param2: "bar", param4: false })
TypeScript 同类场景通用约定
- 核心必填参数建议放在最前面,使用位置参数传递
- 可选参数数量超过2个,或者存在需要跳过前置可选参数赋值的场景,一律使用配置对象模式,不要使用零散的位置可选参数
- 除非有特殊的API向后兼容要求,否则不要用函数重载来兼容多组合的位置传参,维护成本远高于配置对象模式
内容的提问来源于stack exchange,提问作者user842225
相关产品推荐
相关产品推荐

