为何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
相关产品推荐
相关产品推荐

