typescript 属性“map”在类型“MenuItemsProps”上不存在. ts(2339)?

6ss1mwsb  于 2023-04-07  发布在  TypeScript
关注(0)|答案(2)|浏览(257)

我开始学习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[] }

o0lyfsai

o0lyfsai1#

将“menuItems.map“替换为“Data.map“。您当前正在尝试Map一个props对象。

2w3rbyxf

2w3rbyxf2#

这里有几个问题。
1.有一些无效的JSX:<h2>缺少其结束标记。

  1. menuItems是props对象。您传递给组件的任何props都将作为该对象的属性提供。要访问Project组件提供给MenuItems的ClassType[],您需要访问该对象的menuItems属性。因此,您必须将其作为menuItems.menuItems访问或解构它:
menuItems.menuItems.map((item: ClassType) => {...})
// or
const MenuItems = ({ menuItems }: MenuItemsProps) => {...}

1.最后,实际的TypeScript问题:你声明menuItems prop为React.Dispatch<React.SetStateAction<ClassType[]>>,但这是一个函数的类型,而不是一个数组(具体来说,它是Project.tsxsetMenuItems()函数的类型)。根据你在Project组件中给出的MenuItems,你实际上只希望它是以下内容:

type MenuItemsProps = {
    menuItems: ClassType[]
}

相关问题