新闻中心
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
一款集成AI换脸、照片跳舞等多种AI特效玩法的App
124
查看详情
- readonly unknown[] | []: 我们将泛型 T 约束为 readonly unknown[] 或 []。readonly 确保传入的数组不会被修改,unknown 允许传入任何类型的函数。| [] 允许函数不传入任何参数。
-
{ -readonly [P in keyof T]: Re
turnType} : 这是一个映射类型,它遍历 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对象添加新属性的正确姿势


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