我开始学习TypeScript,目前我正在将React代码转换为TypeScript。然后我遇到了这个问题,我无法解决它。基本上,我通过已实现值的props组件传递状态,并希望此状态将在其他组件上识别,但当我试图将状态Map到其他组件时,我会出错。
来自MenuItems.tsx的错误:
属性“map”在类型“MenuItemsProps '. ts”上不存在(2339)
Project.tsx出错
类型“ClassType[]”不可分配给类型“Dispatch〈SetStateAction〈ClassType[]〉〉”。类型“ClassType[]”未提供签名“”的匹配项(值:设置状态操作〈类类型[]〉):void'.ts(2322)
代码如下:Project.tsx
import Data from '@/assets/data/Data'
const Project = () => {
const [menuItems, setMenuItems] = useState<typeof Data>(Data);
return (
<MenuItems menuItems={menuItems} /> // Error here in menuItems
)
}
MenuItems.tsx
import Data from '@/assets/data/Data'
type MenuItemsProps = {
menuItems: React.Dispatch<React.SetStateAction<ClassType[]>>
}
const MenuItems = (menuItems: MenuItemsProps) => {
return (
<div className='menuitem'>
<h1>sample</h1>
{
menuItems.map((item: ClassType) => { // the Error is coming from map
return <div className='menuitem-list' key={item.id}>
<h2>{item.title}</h2>
</div>
})
}
</div>
)
}
Data.ts
import { ClassType } from "../types/Types";
const portfolios: Array<ClassType> = [
{
id: 1,
title: 'Example1',
},
{
id: 2,
title: 'Example1',
},
{
id: 3,
title: 'Example1',
},
]
export default portfolios;
Types.ts
export type ClassType = {
id: number,
title: string,
}
所以我尝试使用Dispatch和SetStateAction,但不幸的是没有帮助
---编辑---
在以下评论的帮助下,问题已得到解决:我在{ menuItems }上添加了花括号:
const MenuItems =({ menuItems }:菜单项属性)=〉{
然后将这个“React.Dispatch〈React.SetStateAction〈ClassType[]〉〉”替换为ClassType[],问题是:
type MenuItemsProps = { menuItems:ClassType[] }
2条答案
按热度按时间o0lyfsai1#
将“menuItems.map“替换为“Data.map“。您当前正在尝试Map一个props对象。
2w3rbyxf2#
这里有几个问题。
1.有一些无效的JSX:
<h2>
缺少其结束标记。menuItems
是props对象。您传递给组件的任何props都将作为该对象的属性提供。要访问Project组件提供给MenuItems的ClassType[]
,您需要访问该对象的menuItems
属性。因此,您必须将其作为menuItems.menuItems
访问或解构它:1.最后,实际的TypeScript问题:你声明
menuItems
prop为React.Dispatch<React.SetStateAction<ClassType[]>>
,但这是一个函数的类型,而不是一个数组(具体来说,它是Project.tsx
中setMenuItems()
函数的类型)。根据你在Project组件中给出的MenuItems,你实际上只希望它是以下内容: