输入 React 组件工厂函数

2023-12-03

给定类型

type EnumerableComponentFactory = <C, I>(config: {
  Container: React.ComponentType<C>;
  Item: React.ComponentType<I>;
}) => React.FC<{ items: I[] }>;

通过以下实施

const Enumerable: EnumerableComponentFactory =
  ({ Container, Item }) =>
  ({ items }) =>
    (
      <Container>
        {items.map((props, index) => (
          <Item key={index} {...props} />
        ))}
      </Container>
    );

和预期用途

const UnorderedList = Enumerable({
  Container: ({ children }) => <ul>{children}</ul>,
  Item: ({ title }: { title: string }) => <li>{title}</li>,
});

<UnorderedList items=[{title: "Something"}] />

我观察到以下 TypeScript 错误

Type '{ children: Element[]; }' is not assignable to type 'C'.
  'C' could be instantiated with an arbitrary type which could be unrelated to '{ children: Element[]; }'.ts(2322)

这引出了我的问题:我需要设置什么类型约束来解决此错误?

我尝试按如下方式更改类型:

type EnumerableComponentFactory = <C extends { children?: Element[] }, I>(config: {
  Container: ComponentType<C>;
  Item: ComponentType<I>;
}) => (props: { items: I[] }) => ReturnType<FC<I>>;

但这会产生一个更加神秘的错误消息,为了简洁起见,我将省略该消息。


附:该函数本身实际上完全符合预期。只是编译器出错了。


是否有必要保留C通用参数?

import React, { FC, ComponentType, PropsWithChildren } from "react";

type EnumerableComponentFactory = <I>(config: {
  // or Container: FC<{ children: JSX.Element[] }>;
  Container: FC<PropsWithChildren<object>>;
  Item: ComponentType<I>;
}) => FC<{ items: I[] }>;

const Enumerable: EnumerableComponentFactory =
  ({ Container, Item }) =>
  ({ items }) =>
    (
      <Container>
        {items.map((props, index) => (
          <Item key={index} {...props} />
        ))}
      </Container>
    );

const UnorderedList = Enumerable({
  Container: ({ children }) => <ul>{children}</ul>,
  Item: ({ title }: { title: string }) => <li>{title}</li>,
});

const result = <UnorderedList items={[{ title: "Something" }]} />;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

输入 React 组件工厂函数 的相关文章

随机推荐

  • 如何使用 Yocto SDK 构建 Linux 内核模块?

    我正在尝试使用 Yocto SDK 构建 Linux 内核模块 但是 我遇到了编译错误 它抱怨 include uapi asm generic int ll64 h 12 10 fatal error asm bitsperlong h
  • 修改密码后无法登录mysql 5.7.9

    我已经安装了MysqlVer 14 14 Distrib 5 7 9 适用于 Linux x86 64 使用 EditLine 包装器 On CentOS Linux 版本 7 1 1503 我使用以下命令更改了 root 密码 alter
  • 为新的输入字符串重用 Antlr 对象(C++ 运行时)?

    我已经使用 C 运行时演示构建了一个基本解析器 并且运行良好 但是 我通常会解析大量输入字符串 是否可以修改代码以重用现有对象进行重复调用 如果是这样 有人有这方面的例子吗 是的 可以重复使用这些对象 解析调用的典型序列如下所示 input
  • XMLHttpRequest 读取外部文件

    我想通过 JavaScript 在客户端浏览器上运行 检索文本文件 从给定 URL 中包含的数据 到目前为止 我已经尝试过以下方法 var xmlhttp text xmlhttp new XMLHttpRequest xmlhttp op
  • 如何访问 SQL2005 Profiler 中的 Context_Info() 变量?

    我使用 Context Info 变量来跟踪正在执行存储过程和自由格式 SQL 的用户 对此服务器上的问题进行故障排除时 每个会话都会通过 我希望能够引入 context info 变量的值并基于它进行过滤 在设置 context info
  • 如何实现连续拖拽菜单效果?

    我正在尝试实现拖放菜单效果 我不知道该怎么做 也许有人有这种确切效果的经验 很简单 当用户触摸菜单项时 我希望在他们触摸的位置出现一个图形 他们的触摸现在将控制图形的平移 释放触摸后 图形将位于其位置并呈现完整的 Alpha 我已经熟悉创建
  • Rhino:在 Javascript 实现中访问 Java 接口变量

    Rhino 如何在Javascript实现中访问Java接口变量 我向其他方公开了一个 java 接口 让他们在 javascript 中提供相同的实现 public interface APIInterface public static
  • pg_ctl:加载共享库时出错:libpq.so.5

    我正在尝试通过以下方式获取 postgres 服务器状态 sudo etc init d postgres status u postgres 但出现以下错误 home alex olddisk usr local pgsql bin pg
  • ImportError:Python 中没有名为 ... 的模块错误 - 设置 PYTHONPATH 仍然不起作用

    我遇到与此处描述类似的问题如何修复 Python 中的 ImportError 没有名为 的模块 错误 但我无法通过设置 PYTHONPATH 的建议来修复它 我的目录如下所示 project python src ml init py c
  • File.ReadAllLines() 紧随其后的 File.WriteAllLines() 由于锁定而导致异常

    在我的程序中 我有一段代码 var lines File ReadAllLines myFileName if lines 0 null does a few things File WriteAllLines myFileName lin
  • 如何以编程方式设置实体框架代码优先的连接字符串?

    我正在尝试编写一些代码 允许我在 SQLCE 在我的开发计算机上本地 和完整 SQL 在 AppHarbor 上 之间切换 使用 SQL CE 连接字符串都为我处理 但我必须自己为 SQL 构造它 到目前为止我的代码如下 但是它给出了这个错
  • 在通过参数传递的对象上使用语句

    寻求有关正确使用 C using 语句的最佳输入 我可以用吗using参数对象上的语句 如以下不常见的示例代码片段 即多层应用程序 所示 虽然代码片段与我认为 using 语句应该在的不同ProcessFileAndReturnNumber
  • C++中的迭代器不是指针的一种吗?

    好吧 这次我决定使用STL 来制作一个列表 我需要为每个客户端创建一个专用的 TCP 套接字 因此 每当我建立连接时 我都会实例化一个套接字并在列表中添加一个指向它的指针 list
  • HTML 表单输入字段,以逗号分隔

    我试图弄清楚如何在一个表单中的单个文本框中输入多个单词 每个单词用逗号 分隔 然后根据逗号对单词进行配对 并将每个单词作为单独的记录插入到数据库中 我想到的是接受输入 然后使用php的explode函数分离出单词 并存储在数据库中 但我不知
  • C 中 array 和 &array[0] 之间的区别

    考虑到这个声明 int 数组 我知道数组 0 将第一个元素的地址作为其值 但是关于 大批 我在我的程序中尝试了这个 它还返回了第一个元素的地址 那么有什么区别呢 尝试 之间的差异 A 65LL and 65 0 所有值都彼此相等 假设为 A
  • 如何使用 C# 将 vlc 嵌入到我的 Windows 窗体应用程序中

    我正在尝试制作一个可以控制我的 IP 摄像机的应用程序 VLC 媒体播放器可以做到这一点 但我不知道如何将其嵌入到我的应用程序中以向其添加功能 例如捕获图片 我应该做什么 VideoLAN Wiki 有关于以下内容的链接 Net 与 VLC
  • 将应用程序清单添加到 eclipse 中的 win32 应用程序

    如何将应用程序清单添加到在 Eclipse 中开发的 Win32 应用程序中 我想添加一个清单以便使用版本 6Comctl32 dll其中 根据this要创建具有 Windows XP 视觉样式的表单控件 需要阅读本文 我正在将 MingW
  • WebApiCompatShim - 如何使用 MVC 6 配置 REST api

    我正在看这个链接展示了如何从 Web API 2 迁移到 MVC 6 我正在尝试在我的控制器中使用 Action 方法HttpRequestMessage边界 这适用于 Web Api 2 Route Name AddTaskRoute H
  • 在 Python 中将时区偏移应用于日期时间

    对于给定的日期字符串 例如2009 01 01T12 00 00 0100我想要 UTC 日期时间对象 from datetime import datetime datetime strptime 2013 03 21T14 19 42
  • 输入 React 组件工厂函数

    给定类型 type EnumerableComponentFactory