Typescript 部分类型推断

2023-12-07

我对此感到困惑,无法弄清楚如何在没有第二个功能的情况下做到这一点:

interface Fixed { a: number }
const fn = <A, B extends {} = {}>(b: B) => {
  return b
}

fn({ a: 1 }) // { a: number }
fn<Fixed>({ a: 1 }) // {}

const fn2 = <A>() => <B extends {} = {}>(b: B) => {
  return b
}

const result = fn2<Fixed>()({ a: 1 }) // { a: number }

为什么如果我修复类型 A,Typescript 无法推断出 B 的类型? 如果我返回一个函数,该函数又尝试推断 B 的类型,那么一切都会再次正常。


类型推断基于全有或全无原则。在第一种情况下:

fn({ a: 1 })

没有提供泛型类型参数,因此它将推断两者:

  • B将被推断为{ a: number }基于函数参数;
  • and A将被推断为unknown因为它没有在函数中的任何地方使用。

在第二种情况下:

fn<Fixed>({ a: 1 })

您已经指定了其中一种泛型类型,不幸的是这意味着类型推断将不会用于其余类型参数- 所以:

  • A指定为Fixed;
  • B没有给出,所以它不会推断它,而是默认为{}.

尽管这很烦人,但这就是 TypeScript 的工作原理。您的第二个带有两个函数调用的示例是此问题的常见解决方法。

Related issue在 GitHub 上。

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

Typescript 部分类型推断 的相关文章

随机推荐

  • 当鼠标离开屏幕时如何停止移动

    我希望有人可以帮助我解决一个小问题 目前 我在主摄像头上附加了一个输入管理器 允许用户通过将鼠标移动到窗口边缘来平移地图 但我遇到了一个小问题 我尝试自行修复但无济于事 如果鼠标移出窗口 平移仍然会发生 当我调试或使用其他应用程序时 我觉得
  • 如何使轴在网格线之间打勾

    在下面的简单示例中 如何使 x 轴刻度值出现在网格之间 import numpy as np import matplotlib pyplot as plt np random seed 1 x range 10 y np random r
  • 发布请求后收到 400 错误请求

    当我发送以下 http post 请求时 POST query fcgi HTTP 1 1 Content Type application x www form urlencoded Content Length 63 form stat
  • 使用 Google Sheet 导入 XML 并每分钟自动刷新

    我有下面的脚本 它在名为 价格 的 google 表中导入一些 XML 数据 一切工作正常 除了我设置了一个时间驱动的触发器每分钟运行一次 但数据不会更新 触发器似乎工作正常 因为我可以看到最后一次运行时间每分钟更新一次 调用 XML 数据
  • 为什么 gcc/clang 处理代码的方式略有不同? (给出的例子)

    所以我在摆弄 C 代码时 我注意到 gcc 和 clang 处理代码的方式 如果我使用可变大小在文件范围中声明一个数组 clang 编译没有问题 但 gcc 会抛出错误 我的猜测是 这与 gcc clang 默认情况下启用 未启用哪些编译器
  • 使用 jQuery 更新 css

    我正在尝试使用 jQuery 更新导航栏的 CSS 通常将 css 定义为 navbar static top navbar nav gt active gt a background color black 我该如何使用类选择器 无需单独
  • 授予远程用户(非管理员)使用 WMI 和 C# 枚举命名空间 cimv2 中 Win32_Service 中的服务的能力

    我正在创建一个看门狗服务 它将监视各种远程服务器 都在同一域中 上的其他服务 我用来连接远程服务器的用户不是管理员 当我尝试枚举 Win32 Service 类中的服务时 出现访问被拒绝错误 我已向用户授予 WMI 控件中 Root CIM
  • 推送到分支时未触发 Github 操作

    My build and test yml文件输入 github workflows如下 name CI on push branches main name of my branch pull request branches main
  • Java接口扩展问题

    我必须实现一个 RMI 服务器 它将作为另外两个 RMI 服务的前端 因此 我决定要做的一个合乎逻辑的事情是让该接口实现其他两个服务的接口 public interface FrontEndServer extends Remote Boo
  • Inno Setup 中不同语言的不同许可证文件

    我在 Inno Setup 中创建了多语言安装文件 如何针对不同语言使用不同的许可证文件 例如 英语语言 gt 英语许可证俄语 gt 俄语许可证 如果您只想要每种语言的自定义许可证 您可以使用指定LicenceFile上的参数 Langua
  • 为什么 SkiaSharp Touch SKTouchAction.Moved 事件不起作用?

    Summary ActionType 为 的情况下永远不会引发 Touch 事件SKTouchAction Moved but SKTouchAction Pressed被提出 为什么 Moved事件永远不会被引发 Detail 我正在尝试
  • 在java中找不到要求创建类的符号

    我有一个类定义如下 public class Myclass public int myvariable 100 if myvariable gt 0 为什么我前面出现错误if condition说明cannot find symbol s
  • 反应寄存器错误不显示

    我正在链接 Web 应用程序的正面和背面 并且在注册部分中 我无法向 UI 显示验证和服务器错误消息 当执行错误注册时 我收到 400 和 401 状态我想显示的消息位于 Axioserror gt response gt data gt
  • 尝试构建正则表达式来检查模式

    a 以数字开头和结尾b 连字符应以数字开头和结尾c 逗号应以数字开头和结尾d 数字范围应为 1 31 编辑 在正则表达式中需要这条规则 谢谢 Ed Heal e 如果数字以连字符 开头 则不能以逗号以外的任何其他字符结尾 并且遵循上面列出的
  • 是否可以在堆栈上创建类的实例?

    我知道在 C 中你可以在堆栈上创建类的实例 例如 MyClass mc MyClass 8 2 或者像在堆上 MyClass mc new MyClass 8 2 你能在 C 中做同样的事情吗 我在 C 中创建类的唯一方法是newing i
  • 使用 R 从 API 中提取数据

    我可以访问 azure 中的一些遥测数据 特别是使用移动应用程序的客户的所有 API 调用 我已经使用 R 中的 httr 包来请求 3 分钟内的数据 并像这样评估响应 显然有我自己的应用程序 ID 和密钥 下面我没有包含 install
  • MySQL INNER JOIN 仅从第二个表中选择一行

    我有一个users表和一个payments表中 对于每个有付款的用户 在表中可能有多个关联的付款payments桌子 我想选择所有有付款的用户 但只选择他们最新的付款 我正在尝试这个 SQL 但我以前从未尝试过嵌套 SQL 语句 所以我想知
  • 如何获取另一个jar中的资源

    我有一个嵌入在捆绑包中的 jar 需要获取与其打包的资源 如下所示 MyBundle src lib MyEmbeddedJar src SomeClass someResource xml 我正在尝试从 SomeClass 访问 some
  • 使用 Macports 偷偷修补源代码

    几乎自从我使用 vim 并了解了足够多的 C 语言以来 我就自定义了已安装的 vim 以删除令我烦恼的 功能 当我改用带有 macports 的 Mac 时 我通过卸载以前的任何 vim 端口 获取源代码 手动编辑源代码 然后让 Macpo
  • Typescript 部分类型推断

    我对此感到困惑 无法弄清楚如何在没有第二个功能的情况下做到这一点 interface Fixed a number const fn