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

如何在TypeScript-React中为含可选默认字段对象的命名可选参数定义类型?

如何为嵌套可选参数的每个字段单独设置默认值?

我想实现类似原生HTML组件中style属性的效果:

<div ref={ref} style={{ overflow: 'visible', height: 600, width: '100%' }}>

style本身是可选属性,传入的对象内的字段同样可选(且带有默认值)。我尝试查看源码但完全看不懂。

我已尝试的方案

function a({
  param1 = 'default param1',
  options = { option1: 'default option1', option2: 'default option2' },
}: {
  param1?: string;
  options?: { option1?: string; option2?: string };
}) {
  console.log(param1);
  console.log(options);
}

a({});
a({ param1: 'my param1' });
a({ param1: 'my param1', options: { option1: 'my option1' } });

运行结果:

[LOG]: "default param1" 
[LOG]: {
  "option1": "default option1",
  "option2": "default option2"
} 
[LOG]: "my param1" 
[LOG]: {
  "option1": "default option1",
  "option2": "default option2"
} 
[LOG]: "my param1" 
[LOG]: {
  "option1": "my option1"
} 

这个方案几乎可行,但当我仅传入options中的option1时,options的默认值会被完全覆盖。请问如何为options中的每个字段单独设置默认值?

解决方案

方式1:解构时直接为子字段设默认值

通过嵌套解构,给每个子字段单独指定默认值,同时为外层options设置空对象默认值避免报错:

function a({
  param1 = 'default param1',
  options: {
    option1 = 'default option1',
    option2 = 'default option2'
  } = {},
}: {
  param1?: string;
  options?: { option1?: string; option2?: string };
}) {
  const options = { option1, option2 };
  console.log(param1);
  console.log(options);
}

调用后,仅传入option1时,option2会保留默认值,完全符合需求。

方式2:对象展开合并默认配置

如果子字段较多,可将默认配置单独提取,再通过展开运算符合并传入值与默认值:

const defaultOptions = {
  option1: 'default option1',
  option2: 'default option2'
};

function a({
  param1 = 'default param1',
  options = {},
}: {
  param1?: string;
  options?: { option1?: string; option2?: string };
}) {
  const mergedOptions = { ...defaultOptions, ...options };
  console.log(param1);
  console.log(mergedOptions);
}

这种方式更易维护,新增字段只需修改defaultOptions即可,效果与方式1完全一致。

关键注意点

  • 使用方式1时,必须给options设置= {}的默认值,否则不传options参数时,解构子字段会因options为undefined抛出错误。
  • 两种方式都能实现类似HTML style的效果:父属性可选,子字段可选且各自保留默认值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:20:35