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

React/TS未正确识别声明类型 类型{}不可赋值为()=>void报错

问题原因
  • 函数组件参数接收规则错误:React函数组件的入参永远是所有传入属性组成的props对象,你当前写法(onAddTodo: ()=>void)是把整个props对象的类型标注为无返回值函数,TS会认为这个组件不接收任何键值对形式的属性,自然会报onAddTodo属性不存在的错误。
  • 展开运算符使用错误:JSX里的{...xxx}语法要求xxx是可枚举的普通对象,会把对象的键值对展开为组件的属性。你直接展开newTodoCard这个函数本身,函数不是存属性的普通对象,自然无法展开,这就是第一处报错的来源。网上提到的展开写法修复是针对「把待传属性整理成一个对象后统一展开」的场景,不是让你直接展开函数值。
修复方案

你不想单独定义完整Interface完全可以实现,不需要额外写type/interface声明,直接在组件参数位置做解构+内联类型标注即可:

修正Sidebar组件

import React from 'react'
import TitleCards from './TitleCards'
import SidebarHeader from './SidebarHeader'

// 解构props对象,内联标注类型,无需单独定义Interface
const Sidebar = ({ onAddTodo }: { onAddTodo: () => void }) => {
  return (
    <div className="sidebar">
        {/* 向下传递时直接传属性即可,不要直接展开函数值 */}
        <SidebarHeader onAddTodo={onAddTodo}/>
        <TitleCards/>
    </div>
  )
}

export default Sidebar

修正App组件的传参方式

去掉错误的函数展开写法,直接按属性名传递即可:

// 其余逻辑保持不变,仅修改Sidebar组件的调用
<Sidebar onAddTodo={newTodoCard}/>

额外逻辑提醒:你当前newTodoCard函数内直接给普通变量currentTodoCard重新赋值的写法不会触发组件重渲染,下游的TodoCard组件拿不到更新后的值。如果要同步更新视图,需要调用你已经定义的setTodoCards方法修改state,不要直接修改组件内的普通变量。

内容的提问来源于stack exchange,提问作者oscar-lauth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:12:19