参数允许包装泛型函数,但推断不允许

2024-02-25

当对函数参数使用推理时,如果不适用于实用程序类型参数,Typescript 会引发错误。举个例子:[操场 https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgGLADaSgHgCoB8yA3gFDIXIAUoADgFzJ4CUjARgPYcYRwgDcpAL6lSYAJ60UASRC0ACnChwAtjlTIIAD0ggAJgGc0mbDhAQAbtAJEAvMkXKVEbAfUEA2gAYAuoIlSyLK0sjDQ6po6EPpG6Fjh5lZQNsj2Gtq6hsbxuKBhUExEAPxMyIyJ0IKkMACuIAhgwBwgyADuygpKqhEZ0VlxphXJBFQwJoyorNmmwY7dqClklMgIzQZgbR1SBfY0coyzXWoLU5zcvC22RGNYe7TMgstQLjVQLe1wtNuCItV1DU13h1QuF0lEYtMEpZrCMbmAJlMBuFgiDcAsiEtKKsQOtNp9tqlqHQDnJUe5TlweHxUtcTHcHuRKM8wK8gfjKsJRAEUABlYAqWg8AaEqjMGnIM5UgRiSQoOYqQmHJw4PkCoUmAj8CgAem1yDqeggY3MehlgVRitJIHyKv5gogA01yF1+pAAGsQBxWiBSEA]

interface Filter<T> {
    (inp: T): boolean;
}

// get parameter using Parameters
type InpParam<F extends Filter<never>> = Parameters<F>[0];
// get parameter using infer
type InpInfer<F extends Filter<never>> = F extends Filter<infer T> ? T : never;

// compiles fine
function wrapParam<F extends Filter<never>>(filt: F): Filter<InpParam<F>> {
    const wrapper = (inp: InpParam<F>): boolean => filt(inp);
    return wrapper;
}

function wrapInfer<F extends Filter<never>>(filt: F): Filter<InpInfer<F>> {
    const wrapper = (inp: InpInfer<F>): boolean => filt(inp);
    //                                                  ^^^
    // argument of type InpInfer<F> is not assignable to type never
    return wrapper;
}

我不太确定为什么 InpParam 可以分配给 never,例如当 InpInfer 不是并且被推断为未知时,被推断为从不。我可能与他们如何处理空参数有关,但这里参数实际上返回了错误的东西,它返回未定义而不是未知。 (错误的是,我的意思是未知是更通用的输入参数,因为函数参数是逆变的)。

我很好奇如何解决这个问题,原因有两个:

  1. undefined类型太窄,实际类型应该是unknown。当与另一种类型相交时,这会带来一个特殊的问题,因为unknown & T => T but undefined & {} => never.
  2. 对于复杂的输入类型,编写表达式来提取嵌套类型可能很复杂、难以阅读,并且对于更改对象定义来说很脆弱。然而,只要泛型具有相同的语义,Infer 就始终有效。

Notes

  • 我知道可以通过在输入参数中使包装器通用来编写有问题的特定包装器,但是如果我还想保留过滤器本身的类型,则情况并非如此(为了清楚起见,这些示例并未说明这一点) 。
  • 我还知道这里的特定包装器不执行任何操作,因此可以省略。

None

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

参数允许包装泛型函数,但推断不允许 的相关文章

随机推荐

  • 如何解决 RASA NLU 中未对齐的实体注释错误

    我正在尝试将 LUIS 架构模型导入 RASA 并尝试使用 spacy scikit 管道对其进行训练 我正在使用 RASA NLU v0 10 4 但是当我尝试加载 LUIS 模型架构时 ner crf 组件会抛出实体注释未对齐警告 尽管
  • 垂直滚动的整页背景图像

    我正在尝试创建一个页面 其中背景图像响应浏览器的屏幕尺寸 但是 我需要该图像下的内容 这样如果该人向下滚动 背景图像就会结束 这很难解释 所以我尝试创建一个图像以使其更清晰 尝试这个Fiddle http jsfiddle net Uwt6
  • 即使测试通过,鼻子测试跑步者也会显示日志记录

    我在用nosetests test py运行单元测试 import unittest import logging class Test unittest TestCase def test pass self logging getLog
  • Twitter Bootstrap 导航栏的按钮可以左对齐吗?

    我希望该按钮出现在移动设备上菜单的左侧 Twitter Bootstrap 可以实现这一点吗 这是我的标记
  • 如何使用 log4net 记录 Trace 消息?

    我正在使用 log4net 将写入日志消息记录到滚动日志文件中 现在我还将重定向所有跟踪消息System Diagnostics Trace到该日志文件 我该如何配置呢 我试图在 log4net 文档中找到任何相关内容 但没有成功 有可能吗
  • 如何在 Python Shell 中换行?

    在 IDLE 中 假设我想用两行编写以下内容 x 3 print x 5 但是当我输入 x 3 并按 Enter 时 它会执行分配 如何让它在两行都输入后执行 已阅读 Python 教程的第一页 但没有回答这个 有趣 的问题 Use the
  • Django 按向后外键排序

    我目前有以下型号 class ChatRoom models Model creator models ForeignKey User points to the initial user class Message models Mode
  • 使用 Flash 或 Silverlight 进行语音识别

    我正在开发一个网络用户界面来输入一些不是很复杂但需要实时加载的信息 我认为该应用程序可以利用语音识别来促进任务 该界面的核心是使用 Javascript 和 jQuery 构建的 但可以轻松包含 flash 或 silverlight 组件
  • 如何避免读取 pandas.read_excel 中的空行

    我有一个包含一百万行的 Excel 工作表 只有前一百行左右有数据 其余行都是空的 pandas read excel 内部使用 xlrd 来读取数据 反过来 xlrd 会读取整张纸并花费大量时间 大约 65 秒 我尝试了下面的代码 但无法
  • 如何在使用bundle install --deployment时包含bundler本身

    我正在尝试供应商化我的 ruby 应用程序 这样我就不必在服务器上手动安装任何 gem 并且可以在我们的 puppet 设置中将我的应用程序部署为 rpm 这几乎可以工作 除了尽管我向 Gemfile 添加了一个 require bundl
  • 将 XML 资源传递给 XMLReader

    我正在尝试通过 xml文件来自我的res文件夹到XMLReader为了将其解析为对象 private void parseXML String parsedData try Log w AndroidParseXMLActivity Sta
  • 是否可以将 SDL2 与智能指针一起使用?

    我有这行代码 std unique ptr
  • strlen() 和 UTF-8 编码 [重复]

    这个问题在这里已经有答案了 假设UTF 8编码 PHP中的strlen 这个字符串的长度有可能是4吗 我只想了解 strlen 而不是其他函数 这是字符串 1 2 我在自己的电脑上测试过 验证了UTF 8编码 得到的答案是6 我在 strl
  • Client.ipa 不包含文件

    自从过去几天以来 我一直在为这个错误而烦恼 当我尝试提交基于 cordova 的 iOS 应用程序时 出现符号工具失败的错误 这是我的日志中的内容
  • nvcc 和 NVIDIA-smi 显示的不同 CUDA 版本

    我对运行时显示的不同 CUDA 版本感到非常困惑which nvcc and nvidia smi 我的 ubuntu 16 04 上安装了 cuda9 2 和 cuda10 现在我将 PATH 设置为指向 cuda9 2 所以当我跑步时
  • Android 列表视图中未显示顶部和底部分隔线

    按照我的理解 为列表视图定义的分隔线也应该出现在列表的顶部和底部 即第一个项目的上方和最后一个项目的下方 由于某种原因 它们没有出现在我的列表视图中
  • 出现错误:插件/预设文件不允许导出对象,只能导出函数

    我在使用 webpack 和 babel 设置我的 React 应用程序时遇到此错误 我尝试更改 babel 的版本 但仍然遇到相同的错误 我不明白问题出在哪里 ERROR in src index jsx Module build fai
  • 使用 Fluent NHibernate 执行 Sql 语句

    基本上我希望能够做到这一点 session ExecuteSql 我不需要它映射到任何实体或返回任何值 有什么建议么 正如已经提到的 这不是 Fluent NHibernate 问题 但这里有一个示例 public int GetSqlCo
  • 仅 CSS 中的上标?

    如何仅在 CSS 中完成上标 我有一个样式表 我用上标字符标记外部链接 但我很难正确对齐字符 我目前拥有的看起来像这样 a external after font size 50 vertical align top content 但它不
  • 参数允许包装泛型函数,但推断不允许

    当对函数参数使用推理时 如果不适用于实用程序类型参数 Typescript 会引发错误 举个例子 操场 https www typescriptlang org play code JYOwLgpgTgZghgYwgAgGLADaSgHgC