React 的“memo”在返回的函数中删除了泛型

2024-02-24

我想使用 React 的memo对于一个具有generic https://www.typescriptlang.org/docs/handbook/generics.html争论。不幸的是,泛型参数默认为泛型,并且所有花哨的泛型推导逻辑都丢失了(TypeScript v3.5.2)。在下面的例子中WithMemo (using React.memo) 失败并显示:

Property 'length' does not exist on type 'string | number'.
  Property 'length' does not exist on type 'number'.

WithoutMemo正如预期的那样工作。

interface TProps<T extends string | number> {
  arg: T;
  output: (o: T) => string;
}

const Test = <T extends string | number>(props: TProps<T>) => {
  const { arg, output } = props;
  return <div>{output(arg)} </div>;
};

const myArg = 'a string';
const WithoutMemo = <Test arg={myArg} output={o => `${o}: ${o.length}`} />;

const MemoTest = React.memo(Test);
const WithMemo = <MemoTest arg={myArg} output={o => `${o}: ${o.length}`} />;

我看过这个问题 https://stackoverflow.com/questions/53433989/react-memo-with-typescript-in-react,但我认为这与我的问题无关。

可能的解决方案

我找到了一个可能的解决方案通用接口但似乎有点粗糙:

const myArgStr = 'a string';
const myArgNo: number = 2;
const WithoutMemo = (
  <>
    <Test arg={myArgStr} output={o => `${o}: ${o.length}`} />
    <Test arg={myArgNo} output={o => `${o * 2}`} />
  </>
);

interface MemoHelperFn {
  <T extends string | number>(arg: TProps<T>): JSX.Element;
}

const MemoTest: MemoHelperFn = React.memo(Test);
const WithMemo = (
  <>
    <MemoTest arg={myArgStr} output={o => `${o}: ${o.length}`} />
    <MemoTest arg={myArgNo} output={o => `${o * 2}`} />
  </>
);

// Below fail as expected
const FailsWithoutMemo = (
  <>
    <Test arg={myArgNo} output={o => `${o}: ${o.length}`} />
    <Test arg={myArgStr} output={o => `${o * 2}`} />
  </>
);

const FailsWithMemo = (
  <>
    <MemoTest arg={myArgNo} output={o => `${o}: ${o.length}`} />
    <MemoTest arg={myArgStr} output={o => `${o * 2}`} />
  </>
);

有没有更优雅的想法来解决这个问题?


From https://stackoverflow.com/a/60170425/1747471 https://stackoverflow.com/a/60170425/1747471

    interface ISomeComponentWithGenericsProps<T> { value: T; } 

    function SomeComponentWithGenerics<T>(props: ISomeComponentWithGenericsProps<T>) {
      return <span>{props.value}</span>;
    }

    export default React.memo(SomeComponentWithGenerics) as typeof SomeComponentWithGenerics;

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

React 的“memo”在返回的函数中删除了泛型 的相关文章

随机推荐

  • 如何打开/关闭 iPhone 相机闪光灯?

    如何以编程方式打开 关闭 iPhone 的 LED 相机闪光灯 import
  • Python 中的 MATLAB ks密度等效项

    我在网上查看过 但尚未找到答案或方法来计算以下内容 我正在将一些 MATLAB 代码翻译为 Python 其中在 MATLAB 中我希望使用以下函数找到核密度估计 p x ksdensity data 其中 p 是分布中 x 点的概率 Sc
  • 模板类中的 C++ 静态常量数组初始化

    我有以下模板类 template
  • 哪些注册表项决定 Outlook 配置文件

    我需要编写 VBScript 代码来检查 Outlook 是否使用 MAPI 配置文件或 RPC over HTTP S 配置文件 哪个注册表项决定相同 这在 Outlook 2013 中发生了变化 Outlook 2013 开发人员的新增
  • 如何在 Blazor 中直接更改 css(不带变量)?

    我正在使用 Blazor 的服务器端 我想改变body的CSS 在 Jquery 中我可以轻松地编写这样的代码 body css overflow y hidden 但是 通过本教程 Blazor 更改验证默认 css 类名称 https
  • $http.jsonp() 是如何工作的

    这是一个例子 json file name Jon Skeets name Bill Joy 如果这个 json 文件的获取方式为 http jsonp pathToFile then 它返回 404 没有任何问题pathToFile我已经
  • Blade 中的嵌套部分

    我正在研究 Blade 如何实现 section 但它的工作方式与我习惯的 Twig 略有不同 看来你不能将 sections嵌套在一起 Example layout blade php 基本布局文件 favicons meta conte
  • 始终触发且仅触发一次的“transitionend”事件

    我需要一个特别的transitionend like 事件 在所有转换完成后触发一次 或者如果 CSS 中没有定义转换则立即触发 这是我到目前为止所想到的 function event special transitionsComplete
  • 基于媒体查询的可选 Javascript 执行

    我试图弄清楚如何根据当前设备 媒体查询选择性地运行一段 javascript 我正在使用 Twitter Bootstrap 并且基本上有两个版本的媒体查询 media min width 980px media max width 979
  • HashMap(key: String, value: ArrayList) 返回一个 Object 而不是 ArrayList?

    我将数据存储在 HashMap 中 键 String 值 ArrayList 我遇到问题的部分声明了一个新的 ArrayList current 在 HashMap 中搜索字符串 dictCode 如果找到 则将 current 设置为返回
  • SQL aspnet_profile

    知道如何使用 SQL 从基于 UserID 的 aspnet profile 表中获取用户名字和姓氏 因为我想在 Telerik Reporting 中使用作为用户参数 示例行 名字是 George 姓氏是 Test UserID 06b2
  • 如何使 IvParameterSpec 随机但仍解密

    对于 Java 中的加密 文章位于http cwe mitre org data definitions 329 html http cwe mitre org data definitions 329 html声明初始化向量每次都应该不同
  • 将对象数组作为 TempData[] 传递给查看

    我想从后操作返回两个值到视图中RedirectToAction TempData 似乎是理想的选择 因为数据仅用于在用户保存后显示成功消息 我想在成功消息中显示用户刚刚保存的图像的小缩略图以及所保存项目的标题 目前我正在将所有数据作为new
  • 刷新 Integration Services 中的目标架构元数据

    我一直致力于一个包含 150 多个表的大型 ETL 项目 在设计过程中 我必须对几个表的目标列名称和数据类型进行重大更改 我的问题是我无法让 SSIS 查看我更改的表的新架构 所以我想知道如何让 SSIS 刷新此架构 我觉得很荒谬 没有办法
  • 我可以拥有一个 ID 以数字开头的元素吗?

    我可以有一个元素吗id以数字开头或完全是数字 例如 像这样的东西 div div 我可以有一个以 id 为数字的 div 吗 是的你可以 但使用 CSS 选择器选择 设计它会很痛苦 id仅由数字组成的值在 HTML 中完全有效 http w
  • VueJS 有没有办法从父级触发组件方法?

    我一直在搜索信息 只找到了一种从子组件发出事件的方法 然后可以在父组件中监听这些事件 有没有办法从父组件调用子方法 是的 只需在 Children 数组中找到您的组件 或者通过 ref 属性获取它 然后调用方法 ref doc https
  • 使用 subplot2grid 时如何共享x

    我是一名 Matlab 用户 最近转换为 Python 大部分 Python 技能都是我自己掌握的 但在绘图方面我遇到了困难 需要一些帮助 这就是我正在尝试做的 我需要制作一个由 3 个具有以下属性的子图组成的图形 子图布局为 311 31
  • 如何在 WP7 中以编程方式设置选定的全景项目

    我在 WP7 应用程序中使用全景控件 其中一个 PanoramaItems 将您带到另一个页面 然后您可以通过 EmailComposeTask 发送电子邮件 如果您不选择发送电子邮件并按后退按钮 全景图将返回到您上次选择的项目 但是 如果
  • 尽管包含 ,但 Clang 仍拒绝 type_info 不完整

    我不明白为什么 Clang 拒绝以下代码 include
  • React 的“memo”在返回的函数中删除了泛型

    我想使用 React 的memo对于一个具有generic https www typescriptlang org docs handbook generics html争论 不幸的是 泛型参数默认为泛型 并且所有花哨的泛型推导逻辑都丢失