TSX:嵌套递归对象数组接口
TSX: Nested recursive Array of objects interface
我无法让我的 typescript 界面与 react tsx 组件一起工作。
我已将所有项目放入一个对象数组中,其中可能包含子项目。
我尝试了很多不同的界面,但总是以某种错误告终,目前只有地图功能似乎无法与界面一起使用。 (我是菜鸟,昨天第一次开始使用 typescript :P)
interface NavListItem {
ID: string;
title: string;
path_url: string;
child_items?: NavListProps;
}
interface NavListProps {
items: { [index: number]: NavListItem };
}
const NavList: React.FC<NavListProps> = ({ items }) => {
return items.map(item => (
<li key={item.ID}>
<Link to={item.path_url}>{item.title}</Link>
{item.child_items ? (
<ul>{<NavList items={item.child_items} />}</ul>
) : null}
</li>
));
};
我的目标是没有错误和一个工作组件。感谢所有帮助!
如果items
应该是一个数组,那么props的正确接口是这样的:
interface NavListProps {
items: NavListItem[];
}
如您所定义,items
是一个具有任意键值对的对象,唯一的限制是键必须是数字,值必须是NavListItems。但这并不意味着它是一个数组,所以打字稿指出该类型没有 map 方法。
几个附加问题(如评论中所述):
1) 当你递归渲染 NavList 时,你传入 item.child_items,但它被定义为单个 NavListProps,而它应该是 NavListItem[]:
interface NavListItem {
ID: string;
title: string;
path_url: string;
child_items?: NavListItem[];
}
2) 你的组件只返回一个数组,但它应该被包裹在一个片段中:
const NavList: React.FC<NavListProps> = ({ items }) => {
return (
<React.Fragment>
{items.map(item => (
<li key={item.ID}>
<Link to={item.path_url}>{item.title}</Link>
{item.child_items ? (
<ul>{<NavList items={item.child_items} />}</ul>
) : null}
</li>
}
</React.Fragment>
));
};
P.S.: 如果您的构建设置正确,则可以 <></>
as shorthand for <React.Fragment></React.Fragment>
我无法让我的 typescript 界面与 react tsx 组件一起工作。 我已将所有项目放入一个对象数组中,其中可能包含子项目。
我尝试了很多不同的界面,但总是以某种错误告终,目前只有地图功能似乎无法与界面一起使用。 (我是菜鸟,昨天第一次开始使用 typescript :P)
interface NavListItem {
ID: string;
title: string;
path_url: string;
child_items?: NavListProps;
}
interface NavListProps {
items: { [index: number]: NavListItem };
}
const NavList: React.FC<NavListProps> = ({ items }) => {
return items.map(item => (
<li key={item.ID}>
<Link to={item.path_url}>{item.title}</Link>
{item.child_items ? (
<ul>{<NavList items={item.child_items} />}</ul>
) : null}
</li>
));
};
我的目标是没有错误和一个工作组件。感谢所有帮助!
如果items
应该是一个数组,那么props的正确接口是这样的:
interface NavListProps {
items: NavListItem[];
}
如您所定义,items
是一个具有任意键值对的对象,唯一的限制是键必须是数字,值必须是NavListItems。但这并不意味着它是一个数组,所以打字稿指出该类型没有 map 方法。
几个附加问题(如评论中所述):
1) 当你递归渲染 NavList 时,你传入 item.child_items,但它被定义为单个 NavListProps,而它应该是 NavListItem[]:
interface NavListItem {
ID: string;
title: string;
path_url: string;
child_items?: NavListItem[];
}
2) 你的组件只返回一个数组,但它应该被包裹在一个片段中:
const NavList: React.FC<NavListProps> = ({ items }) => {
return (
<React.Fragment>
{items.map(item => (
<li key={item.ID}>
<Link to={item.path_url}>{item.title}</Link>
{item.child_items ? (
<ul>{<NavList items={item.child_items} />}</ul>
) : null}
</li>
}
</React.Fragment>
));
};
P.S.: 如果您的构建设置正确,则可以 <></>
as shorthand for <React.Fragment></React.Fragment>