新闻中心

TypeScript:推断数组类型并保留索引信息

2025-10-11
浏览次数:
返回列表

typescript:推断数组类型并保留索引信息

本文旨在解决 TypeScript 中推断函数参数数组类型时,如何保留数组元素的索引信息,避免类型丢失的问题。通过使用 readonly unknown[] 和映射类型,可以确保推断出的数组类型能够准确反映每个位置元素的具体类型,从而实现更精确的类型定义。

在 TypeScript 中,有时我们需要编写一个函数,该函数接收一个函数数组作为参数,并根据这些函数返回值的类型推断出一个新的数组类型。然而,简单地使用泛型和 infer 可能会导致类型信息丢失,特别是数组的索引信息。本文将介绍如何正确地推断 TypeScript 数组类型,同时保留数组的索引信息,避免类型合并成联合类型。

问题描述

假设我们有以下代码:

const getValues: <T extends Array<() => any>>(
  ...args: T
) => T extends Array<() => infer R> ? R[] : null = (...args) =>
  args.map((arg) => arg());

const values = getValues(
  () => "a",
  () => 123
);

// values 的类型为 (string | number)[],但我们期望的是 [string, number]

我们期望 values 的类型是 [string, number],即一个包含 string 和 number 类型的元组。但实际上,TypeScript 推断出的类型是 (string | number)[],这是一个包含 string 或 number 类型的数组。这意味着我们丢失了数组元素的索引信息,导致类型变得不够精确。

解决方案

为了解决这个问题,我们可以使用 readonly unknown[] 和映射类型。以下是修改后的代码:

const getValues: <T extends readonly unknown[] | []>(
  ...args: T
) => { -readonly [P in keyof T]: ReturnType<T[P]> } = (...args) =>
  args.map((arg) => arg());

const values = getValues(
  () => "a",
  () => 123
);

// values 的类型为 [string, number]

代码解释

秀脸FacePlay 秀脸FacePlay

一款集成AI换脸、照片跳舞等多种AI特效玩法的App

秀脸FacePlay 124 查看详情 秀脸FacePlay
  1. readonly unknown[] | []: 我们将泛型 T 约束为 readonly unknown[] 或 []。readonly 确保传入的数组不会被修改,unknown 允许传入任何类型的函数。| [] 允许函数不传入任何参数。
  2. { -readonly [P in keyof T]: ReturnType }: 这是一个映射类型,它遍历 T 的所有键(索引)。
    • keyof T 获取 T 的所有键。
    • P in keyof T 遍历 T 的每个键。
    • T[P] 获取 T 中索引为 P 的元素类型,即函数类型。
    • ReturnType 获取函数类型的返回值类型。
    • -readonly 移除属性的 readonly 修饰符,确保返回的是可变数组。

通过这种方式,我们可以准确地推断出数组中每个位置元素的类型,并保留索引信息。

示例说明

在上面的例子中,getValues 函数接收两个函数 () => "a" 和 () => 123 作为参数。

  • T 被推断为 [() => "a", () => 123]。
  • 映射类型遍历 T 的键,即 0 和 1。
  • ReturnType 返回 "a" 的类型,即 string。
  • ReturnType 返回 123 的类型,即 number。

因此,最终 values 的类型被推断为 [string, number],这正是我们期望的结果。

注意事项

  • 使用 readonly 可以确保传入的数组不会被意外修改。
  • 映射类型是一种强大的 TypeScript 特性,可以用于创建基于现有类型的新类型。
  • 理解 keyof 和 ReturnType 的用法对于理解映射类型至关重要。

总结

通过使用 readonly unknown[] 和映射类型,我们可以有效地推断 TypeScript 数组类型,并保留数组的索引信息。这种方法可以帮助我们编写更精确、更安全的 TypeScript 代码,避免类型丢失和潜在的运行时错误。在处理函数参数数组时,请务必考虑使用这种方法来确保类型推断的准确性。

以上就是TypeScript:推断数组类型并保留索引信息的详细内容,更多请关注其它相关文章!


# 如何在  # 辽阳seo公司参考火星  # 徐州seo公司推荐15火星  # seo如果搭建外链  # 徐州市整合营销推广方案  # 网站建设的实训报告  # 农家乐网站建设方案  # 无锡seo优化收费  # 乐安seo关键词优化  # 绥化seo助手公司电话  # 图片网站建设素材  # typescript  # 是一种  # 一个函数  # 更精确  # 返回值  # 服务端  # 我们可以  # 这是一个  # 的是  # 遍历 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: excel如何生成目录 excel一键生成工作表目录超链接  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  字由网在线版登录地址 字由网网页版安全入口  Python大型XML文件高效流式解析教程  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  Go RPC HTTP服务正确实现与常见陷阱解析  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】  在python-socketio事件处理器中安全访问Flask应用上下文  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  自定义Bag-of-Words实现:处理带负号的词汇权重  Django模型中自动计算可用余额的实现方法  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  Python多版本共存与虚拟环境管理深度指南  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  React Router 嵌套组件中 URL 重定向问题的解决方案  Win11网速慢怎么解决 Win11网络设置优化解除限速  sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程  J*aScript设计模式实践_j*ascript代码优化  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】  《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  Python类型检查:优化关联可选属性的Mypy推断策略  韩小圈电脑版在线入口_网页版免费登录地址  淘宝支付提示失败如何解决 淘宝支付流程优化方法  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  Node.js中HTML按钮与J*aScript函数交互的正确姿势  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  内存疯狂猛猛涨价:主板销量直接腰斩!  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  批改网学生版PC登录 批改网官网登录系统入口  C++如何解决segmentation fault_C++段错误调试与原因分析  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法  composer的"require-dev"部分是用来做什么的?  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  写好的html代码怎么运行出来_运行写好的html代码方法【教程】  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  J*aScript中向JSON对象添加新属性的正确姿势 

搜索