为什么打字稿无法通过其字段推断通用类型?

2023-11-21

我不明白为什么有时打字稿无法推断 const 的泛型类型。

这是一个例子:

type OneTwoThree = 1 | 2 | 3;

type MyType<num extends OneTwoThree> = {
    n: num;
}

const first: MyType = { // <-- Generic type 'MyType' requires 1 type argument(s).(2314)
    n: 2,
};

const second: MyType<3> = {
    n: 3,
};

为什么打字稿无法推断出这一点first属于类型MyType<2>?

我也尝试过声明MyType这样:

type MyType<num extends OneTwoThree = OneTwoThree> = {
    n: num;
}

但这样首先成为类型const first: MyType<OneTwoThree>...

这是游乐场链接:https://www.typescriptlang.org/play?#code/C4TwDgpgBA8gdhAKgdwPaIBYCcLQLxQCMUAPlAEylQDMA3AFD2iRQCyIi4EAPHAK4BbKBAAewCHAAmAZ1gIU6bLigF4SNJhwQAfCqgBvelGNQ4ALlOCGAX0YBjVHGnAoAMwCWWZxfacWBQxNTC3IAG nprBnoHJxdpCBjJHw4ubmpdAKMTcxpwyKA

有什么建议么?


这是 TypeScript 所缺少的功能;编译器不会推断类型参数generic types, 像N在你的MyType<N>。正如您所注意到的,使用通用参数默认值 does not做这个;当您使用默认值时,您将获得默认值而不是类型推断。仅当您调用通用时功能编译器是否会尝试推断类型参数。

有一个相当长期的公开请求:微软/TypeScript#32794支持泛型类型中的类型参数推断,但目前它还不是该语言的一部分。请注意,由于存在通用参数默认值,因此您将无法获得这样的结果const first: MyType = .... You might能够写出类似的东西const first: MyType<infer> = ...,并可能重写默认值,使其类似于type MyType<N extends OneTwoThree = infer> = ...,但这只是猜测,因为它还不是一个功能。

除非提供这样的功能,否则通常的解决方法是编写通用辅助身份函数。该函数除了返回其输入之外不执行任何操作,但是当您调用通用函数时,您会得到您正在寻找的推论。所以而不是const first: MyType = {...},你会写const first = asMytype({...}):

const asMyType = <N extends OneTwoThree>(m: MyType<N>) => m;

const first = asMyType({
    n: 2,
});
// const first: MyType<2>

Playground 代码链接

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

为什么打字稿无法通过其字段推断通用类型? 的相关文章

随机推荐

  • NodeJS/express - 公共 API 端点的安全性

    我正在开发基于 NodeJs Express 的网站项目 对于某些 UI 部分 我使用 Jquery ajax 请求来获取辅助数据 我们如何处理浏览器用于 ajax 调用的 Rest API 端点的一些基本控制 我正在考虑某种令牌授权 但一
  • 下载自定义文件时 file.download 出错

    我正在尝试从此网址下载 zip 文件 url1 lt http www clinicaltrials gov ct2 results cond 22acne 22 studyxml true 这是我的代码 tempZip lt tempfi
  • 使用 ref 传递引用类型是否节省内存?

    在 C 中 方法的参数可以是引用类型或值类型 传递引用类型时 会传递引用的副本 这样 如果在方法内部我们尝试将传递的引用重新分配给另一个对象实例 则在方法外部重新分配是不可见的 为了使其正常工作 C 有 ref 修饰符 使用 ref 传递引
  • 创建后更改注释图像

    我有一个自定义注释 它使用 viewForAnnotation 委托方法根据注释的类型设置其图像 我只使用 1 个注释来表示一辆正在移动的汽车 并希望在检测到汽车正在移动和停止时更改图像 除了删除注释并重新添加它 导致眨眼 之外 我还能如何
  • System.Drawing.Image 流式传输 C#

    我有一个System Drawing Image在我的程序中 该文件不在内存中保存的文件系统上 我需要从中创建一个流 我该怎么做呢 请尝试以下操作 public static Stream ToStream this Image image
  • Symfony 2 服务容器为空

    我是 Symfony 2 的新手 正在尝试创建一些简单的应用程序来学习 我创建了一个捆绑包GoogleApiBundle 在捆绑包内 我有一个控制器YouTubeController 这是一项服务 services yml service
  • 生成签名的apk android studio

    我是 Android 开发新手 刚刚完成了我的第一个应用程序 我想在 android studio 中生成签名的 apk 我阅读了开发人员文档 但无法理解这些步骤 当我点击Build gt Generate Signed APK 它向我显示
  • Firebase 身份验证 JS/PHP

    我的任务是为基于 firebase 的 Android 应用程序构建 Web 界面 我有一些与数据库 云函数 交互的端点 要访问这些端点 我需要使用电子邮件和密码 1 对用户进行身份验证 检索 accessToken 2 并使用Author
  • 在Matlab中更改图形字体没有效果

    我在标签和图例中渲染希腊字符时遇到问题 所以我想也许切换字体会有所帮助 因此 我发现了一个更大的问题 Matlab似乎根本不尊重我的字体设置 当然我也尝试过 set gcf FontName Ubuntu set gca FontName
  • 如何应用 GCC 补丁

    我正在尝试申请this给 MinGW 上的 GCC 打补丁来获取它编译 GDC 2 但我不知道怎么做 我对 GCC 的内部结构仍然很陌生 甚至对一般的 nix 工具也很陌生 我知道有patch命令 但我不知道如何使用它 我什至不知道我是否有
  • 在写入所有字节之前无法关闭流(GoodData API)

    我做了一些搜索 大多数人在发送大量数据时似乎都会遇到这个问题 但我没有 我正在向 API 发出以下请求 request Method POST request ContentType application json request Acc
  • 为什么 JSON.NET 在反序列化时不支持继承

    我正在使用以下工作正常的类将 JSON 字符串反序列化为根对象 Serializable public class MoviesListRootObject public int count get set public Paginatio
  • 组织一个多文件 Go 项目 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 注意 这个问题与this one 但是两年在Go历史上是一个非常长的时间 在开发过程中组织 Go 项目的标准方法是什么 我的项目是单个包mypack 所以我想我把所有的 go 文件放在一个
  • 如何以编程方式获取带有更新信息的java版本

    java version 打印如下 java version 1 8 0 40 Java TM SE Runtime Environment build 1 8 0 40 b27 Java HotSpot TM 64 Bit Server
  • 将自定义依赖属性绑定到自定义 WPF 样式

    我在设计继承的扩展器时遇到问题 我的目的是在默认 Expander 标题中的切换按钮和文本后面有一个进度栏 我有这个 XAML 代码 它为我提供了标题中的进度条 这是一种定制风格
  • 如何在 Rails 中创建类别

    我正在尝试将类别添加到我的 Rails 应用程序 但不太知道如何执行此操作 我有很多 Pin 图 图像 并希望用户能够在这些 Pin 图上分配类别 ASSIGN无需创建 编辑或删除类别 只需为其 Pin 图选择一个类别即可 这意味着 当用户
  • 如何将 build.gradle 导入 IntelliJ

    NOTE 完整的源代码is here 我使用 Gradle Init 插件创建了一个 Scala 库 gradle init type scala library 然后我修改了它build gradle为 Gradle 2 13 生成包装器
  • Xcode/iOS:如何在向下滚动时隐藏导航和工具栏?

    我想在 iPhone 上向下滚动时隐藏这两个栏 当我向上滚动时 它们应该再次出现 我该如何处理这个问题 void scrollViewWillBeginScroll UIScrollView scrollView if scrollView
  • vuejs 在模板中渲染异步函数显示承诺而不是返回的数据

    我正在调用一个加载个人资料图片的异步函数 await 调用按预期将值返回到变量 pf 但我无法从 loadProfilePic 返回该值 至少一开始我尝试返回一个静态字符串以显示为 object Promise 在 vue 模板中 但是当我
  • 为什么打字稿无法通过其字段推断通用类型?

    我不明白为什么有时打字稿无法推断 const 的泛型类型 这是一个例子 type OneTwoThree 1 2 3 type MyType