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

为何React props可接受async函数作为() => void而非() => Promise<void>?

为什么React的props可以接受() => Promise<void>类型的async函数作为() => void类型的属性传入?

这本质是TypeScript的函数类型兼容性规则导致的,和React本身关系不大:

  • TypeScript对void返回值的函数有特殊处理:只要调用方不会使用函数的返回值,任何返回类型的函数都可以赋值给() => void类型。比如你定义一个() => void的回调,调用时只会执行它,不会去接收或处理它的返回值,那不管这个函数实际返回Promise、数字还是其他,TS都认为是兼容的。
  • Async函数的类型本质:async标记的函数默认返回Promise,所以async () => {}的类型就是() => Promise<void>,但因为上述void函数的兼容性规则,它可以被安全赋值给() => void类型的属性。
这种用法是有意设计还是误用?

这是TypeScript的有意设计,核心原因有这些:

  • 提升开发灵活性:很多回调场景(比如React的点击事件、useEffect回调)本来就不需要关心返回值,允许传入async函数可以避免额外的类型转换代码(比如不用手动写() => { void asyncFunc() }这种包裹层)。
  • 无类型安全风险:因为() => void的类型约定已经明确了“调用方不会使用返回值”,即使实际传入的是返回Promise的async函数,只要开发者遵循约定不去处理返回值,就不会出现类型错误。如果强行去await一个标注为() => void的函数,那属于开发者违反了类型约定,而非类型系统的问题。

结合你的代码示例来看:

interface Props {
  onFunc: () => void
}
const Child = ({onFunc}: Props) => {
  // 这里调用onFunc()时,TS不会提示你可以await它,因为类型是void
  onFunc();
  return <div>Child</div>;
}

const Parent = () => {
  const func: () => Promise<void> = async () => {
    await new Promise(resolve => setTimeout(resolve, 1000));
  }
  // 这里赋值完全符合TS的类型规则,不会报错
  return <Child onFunc={func} />;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:34:56