TypeScript中如何将函数的对象参数设置为可选参数?
结论
完全可以实现。你当前的代码存在两处明显问题:
- 第二个对象参数本身是必填项,未设置可选逻辑
- 解构默认值
true为布尔类型,和标注的objArg: string类型冲突,需要先统一类型。
实现方法
要让第二个对象参数整体可选,核心是给整个对象参数设置默认值(通常为空对象{}),同时同步修正类型定义,给对象内的属性加上可选标记,匹配默认值的类型:
// 适配你原代码里objArg默认值为true的写法,对应类型改为布尔值 const func = (arg1: string, { objArg = true }: { objArg?: boolean } = {}) => { // 业务代码 } // 如果你确实需要objArg为字符串类型,将默认值替换为对应字符串即可 const funcStringCase = (arg1: string, { objArg = "defaultValue" }: { objArg?: string } = {}) => { // 业务代码 }
修改完成后,以下调用方式都是合法的:
func("firstArg") // 不传第二个参数,正常运行 func("firstArg", {}) // 传空对象,objArg取默认值true func("firstArg", { objArg: false }) // 传objArg字段,取传入值
原理说明
- 仅给解构出的
objArg属性加默认值,只能覆盖「传入了第二个参数但没传objArg字段」的场景,完全不传第二个参数时TS会报必填参数缺失的错误 - 给第二个参数整体加上
= {}默认值后,调用时不传该参数,JS会自动用空对象作为入参,再配合解构的属性默认值,就能正常拿到objArg的预设值 - 类型定义中给
objArg加?可选标记,是为了匹配传入空对象时objArg字段不存在的情况,避免类型校验报错
内容的提问来源于stack exchange,提问作者howard wolowitz
相关产品推荐
相关产品推荐

