reactjs - 将 ReactNode 数组传递给功能组件时出现类型检查错误
问题描述
我有一个组件将 ReactNode 数组传递给另一个组件。
const getOptions = (links: Array<Links>): Array<ReactNode> => {
const options: Array<ReactNode> = [];
links.map((link): void => {
options.push(
<Link
href={link.path}
key={link.page}
>
{link.label}
</Link>
);
});
return options;
};
<<<<<some code>>>>>>
<Dropdown dropDownOptions={getOptions(dropdownLinks)} />
我的下拉组件:
const Dropdown = ({ dropDownOptions }: any): JSX.Element => {}
所以我在这里遇到的问题是,当我使用任何作为下拉选项类型时,我会收到警告:
对象模式参数应使用非任何类型键入
但是当我使用 Array 作为类型时,我收到以下错误:
类型“any[]”上不存在属性“dropDownOptions”
我不知道如何解决这个问题。
解决方案
如果您在解构属性上指定类型,则类型签名中也需要相同的结构,因此{ dropDownOptions }: Array<ReactNode>
它需要是
const Dropdown = ({ dropDownOptions }: { dropDownOptions: Array<ReactNode> }) => (
<div>...</div>
)
要不就
const Dropdown = ({ dropDownOptions }: { dropDownOptions: ReactNode[] }) => (
<div>...</div>
)
作为不相关的说明,代码使用map
,但它不是实际的映射,因为它构建具有副作用的结果并丢弃返回的数组。您可以将其重写为纯功能映射,如下所示:
const getOptions = (links: Array<Links>) =>
links.map(link => (
<Link href={link.path} key={link.page}>
{link.label}
</Link>
))
返回类型签名将全部由编译器推断。
推荐阅读
- flutter - 如何在颤动的容器列表中选择单个容器?
- android - React Native Web View Secured url 未在 android kitkat Api 级别 19 中显示,其他可用的设备
- flutter - 为什么我的应用栏颜色与我的背景颜色不同,尽管我在原色和脚手架背景颜色中使用相同的颜色代码?
- ios - 如何在后台模式或屏幕锁定模式下扫描附近的蓝牙设备
- sql - 错误消息指出“无效的列名”,但看起来还不错吗?
- python - 是否可以在 Tkinter 的按钮/标签内隐藏文本?
- c# - 基于客户的 C# 可定制/模块化(webapi)逻辑
- java - 我可以扩展 MapStruct 方法吗?
- mongodb - 如何使用代码在 mongoDB 中创建索引?
- python - 程序不升预定义 ZeroDivisionError