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

如何为React TypeScript自定义hook指定带默认值的可选函数参数

问题原因

你只给了解构后的单个属性设置了默认值,没有给整个入参对象设置默认值。当你调用useMyHook()没有传入任何参数时,函数接收的入参本身是undefined,对undefined执行解构操作就会抛出读取属性失败的错误,和内部属性是否可选、有没有设置属性默认值无关。

修复方案

方案1(推荐):给整个入参对象设置默认值

给hook的入参整体添加空对象作为默认值,这样就算调用时不传参数,解构的目标是有效空对象,会正常应用内部属性的默认值。
因为你当前的UseMyHookProps中onConnect是必填属性,需要同步调整默认参数或者接口定义:

// 调整1:修改接口,将onConnect也设为可选
interface UseMyHookProps {
  onConnect?: () => void;
  onUpdate?: () => void;
  onDisconnect?: () => {};
}

// 调整2:给整个入参对象设置默认值
const useMyHook = ({ 
  onConnect = () => {}, 
  onUpdate = () => {}, 
  onDisconnect = () => {} 
}: UseMyHookProps = {}) => {
  // 原有逻辑
  onUpdate();
};

如果希望保留onConnect为必填属性,可以直接给默认参数补齐必填项:

const useMyHook = ({ 
  onConnect = () => {}, 
  onUpdate = () => {}, 
  onDisconnect = () => {} 
}: UseMyHookProps = { onConnect: () => {} }) => {
  // 原有逻辑
};

方案2:调整调用方式

如果不修改hook定义,调用时传入空对象即可:

const MyComponent = () => {
  useMyHook({}); // 传入空对象而非完全不传参
  // 其他组件逻辑
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:36:02