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

TypeScript函数式组件传递函数参数报错,如何解决?

问题解决方法

错误根源

React函数式组件的参数是单个props对象,而非独立的多个参数。你的Sample组件写法把第一个参数当成了handleDrawerToggle,但实际它接收的是包含所有传入属性的props对象,导致:

  • handleDrawerToggle被赋值为整个props对象,而非预期的函数,触发Expected onClick listener to be a function错误
  • drawerWidth参数实际是undefined,因为没有传入第二个参数

修正后的代码

// Typescript
const App = () => {
  const [mobileOpen, setMobileOpen] = React.useState(false);
  const drawerWidth = 240;
  const handleDrawerToggle = () => {
    setMobileOpen(!mobileOpen);
  };
  return (
    <div>
      <Sample
        handleDrawerToggle={handleDrawerToggle}
        drawerWidth={drawerWidth}
      />
      {mobileOpen && <h1>hello</h1>}
    </div>
  );
};

// 写法1:直接解构并定义props类型
const Sample = ({ handleDrawerToggle, drawerWidth }: {
  handleDrawerToggle: () => void;
  drawerWidth: number;
}) => {
  return (
    <div>
      <button onClick={handleDrawerToggle} style={{ width: `${drawerWidth}px` }}>
        Test
      </button>
    </div>
  );
};

// 写法2:定义Props类型别名(更推荐,可读性更高)
type SampleProps = {
  handleDrawerToggle: () => void;
  drawerWidth: number;
};

const Sample = ({ handleDrawerToggle, drawerWidth }: SampleProps) => {
  return (
    <div>
      <button onClick={handleDrawerToggle} style={{ width: `${drawerWidth}px` }}>
        Test
      </button>
    </div>
  );
};

额外说明

  • 不要再用any类型,它会屏蔽TypeScript的类型检查,失去TS的优势。明确定义props类型后,IDE会提前帮你发现参数错误
  • 样式里的宽度建议加上单位px,避免渲染异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:25:11