新闻中心

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

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

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

本文旨在解决 TypeScript 中函数参数类型推断时,如何保留数组索引信息的问题。通过使用 readonly unknown[] 和映射类型,我们可以确保函数返回的数组类型能够准确地反映输入参数的类型和顺序,避免类型信息丢失,从而获得更精确的类型提示和类型安全。

在 TypeScript 中,我们经常需要编写接受函数作为参数,并根据这些函数的返回值来推断数组类型的函数。一个常见的挑战是如何在推断数组类型的同时,保留数组的索引信息,即确保返回的数组类型能够准确地反映输入参数的类型和顺序。

考虑以下场景:我们需要一个函数 getValues,它接受任意数量的函数作为参数,每个函数返回不同的类型。我们希望 getValues 返回一个数组,其元素的类型与输入函数的返回值类型一一对应。例如,如果 getValues 接受一个返回字符串的函数和一个返回数字的函数,我们希望返回的数组类型是 [string, number],而不是 (string | number)[]。

以下代码展示了如何实现这一目标:

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. T extends readonly unknown[] | []: 这部分定义了泛型类型 T 的约束。readonly unknown[] 表示只读的未知类型数组。| [] 允许函数在不传递参数时也能正常工作。使用 readonly 确保了传入的参数不会被修改。
  2. { -readonly [P in keyof T]: ReturnType }: 这部分是关键所在,它使用了映射类型。
    • keyof T 获取 T 中所有键的联合类型。
    • [P in keyof T] 遍历 T 中的每一个键 P。
    • ReturnType 获取 T 中键 P 对应元素的返回类型。T[P] 相当于访问数组 T 中索引为 P 的元素,由于元素是函数,所以使用 ReturnType 获取函数的返回值类型。
    • -readonly 移除只读修饰符,因为我们希望返回的数组不是只读的。

注意事项:

  • readonly 的重要性: 使用 readonly 可以确保传入 getValues 的参数不会被修改,这是一种良好的编程实践,尤其是在处理函数参数时。
  • 映射类型的强大之处: 映射类型是 TypeScript 中一个非常强大的特性,它可以帮助我们根据已有的类型创建新的类型,从而实现更灵活的类型操作。
  • 类型推断的局限性: TypeScript 的类型推断有时可能无法达到我们的预期。在这种情况下,我们需要手动指定类型或使用更高级的类型技巧来帮助 TypeScript 进行正确的类型推断。

总结:

通过使用 readonly unknown[] 和映射类型,我们可以有效地推断 TypeScript 数组类型,并保留索引信息。这种方法可以帮助我们编写更类型安全、更易于维护的代码。在实际开发中,根据具体的需求选择合适的类型定义方式,可以有效地提高代码的可读性和可维护性。理解 TypeScript 的高级类型特性,例如映射类型和条件类型,对于编写高质量的 TypeScript 代码至关重要。

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


# 遍历  # 怎么在闲鱼做营销推广  # 做网站推广怎么样挣钱  # 柳州市场营销获客推广  # seo的做法步骤  # 优化网站方法及云速捷  # 福建建设局网站  # 汽车网站建设怎样进行  # 山东网站优化加盟费用  # 浙江中职网站建设  # seo地图高清版大图  # typescript  # 也能  # 之处  # 是在  # 服务端  # 如何在  # 有效地  # 这部  # 我们可以  # 返回值 


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


相关推荐: 深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  汽水音乐在线解析 汽水音乐在线解析入口  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  Discord Slash 命令响应超时问题的异步解决方案  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  如何在 Excel Online 和 Google 表格中更改日期格式  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  PostgreSQL海量数据高效导入策略:Python与Django实践指南  J*aScript中如何高效提取对象指定属性  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  J*a应用程序首次运行自动创建文件与目录的最佳实践  AI泡沫首次被“刺破”:GPU十年都无法存活!  妖精动漫免费平台 妖精动漫官网资源观看网址  ArrayList与LinkedList操作复杂度详解:遍历与修改  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示  Archive of Our Own官网直达 AO3最新可用地址一览  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  Python多版本共存与虚拟环境管理深度指南  AO3官方可用镜像 Archive of Our Own网页版最新入口  ArrayList与LinkedList核心操作的Big-O复杂度分析  UC浏览器网页版登录入口官网 电脑版网址入口  Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏  必由学登录入口 必由学官方网站在线访问链接  Bing引擎入口最新2025 Bing搜索免费官方登录  SteamMachine定价或为699美元 大家想入手吗?  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  AO3镜像入口大全 AO3网页版内容访问全集  zookeeper 都有哪些功能?  2026年CSGO开箱网站推荐 CSGO开箱平台精选  快手极速版在线观看 官方网页版登录地址  mcjs网页版在线存档 mcjs云存档登录入口  QQ网页版官方账号入口 QQ网页版网页版登录指南  海量存储:机器视觉智能化的核心基石  学习通在线学习平台 学习通网页版直接进入课程中心  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  新手怎么开始学化妆 零基础化妆入门教程  uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验  葱吃多了会怎样 葱吃多了会伤胃吗 

搜索