新闻中心
TypeScript:保留索引推断数组类型

本文将深入探讨如何在 TypeScript 中编写类型定义,以便在函数参数为一组函数时,能够准确推断返回数组的类型,同时保留每个元素的索引信息。我们将通过一个具体的代码示例,展示如何利用 readonly 和 ReturnType 等高级类型特性,实现精确的类型推断,避免类型信息丢失。
精确推断函数参数返回类型的数组
在 TypeScript 中,我们经常需要编写函数,接收一组函数作为参数,并返回一个由这些函数返回值组成的数组。一个常见的需求是,希望 TypeScript 能够准确推断返回数组的类型,并且保留每个元素的索引信息,例如,如果传入的函数分别返回 string 和 number,我们希望返回的类型是 [string, number],而不是 (string | number)[]。
问题分析
TypeScript 默认会将可变参数推断为联合类型的数组,这会导致类型信息丢失。为了解决这个问题,我们需要更精确地定义函数类型。
解决方案
以下代码展示了如何实现精确的类型推断:
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]代码解释:
AI Surge Cloud
低代码数据分析平台,帮助企业快速交付深度数据
87
查看详情
T extends readonly unknown[] | []: 这里使用了 readonly unknown[],确保传入的参数是一个只读数组。 | [] 允许不传参数。这保证了我们传入的参数是一个元组类型,而非一个简单的数组类型。
-
{
-readonly [P in keyof T]: ReturnType} : 这是一个映射类型,用于将 T 中的每个元素的类型转换为其对应的返回类型。- keyof T 获取 T 中所有键的联合类型。
- P in keyof T 遍历 T 中的每一个键。
- ReturnType
获取 T[P] (即函数) 的返回类型。 - -readonly 移除 readonly 修饰符,使得返回的数组不再是只读的。
(...args) => args.map((arg) => arg()): 这是函数的实际实现,它遍历传入的函数数组,并执行每个函数,然后将结果组成一个新的数组返回。
示例
const getBooleans: <T extends readonly unknown[] | []>(
...args: T
) => { -readonly [P in keyof T]: ReturnType<T[P]> } = (...args) =>
args.map((arg) => arg());
const booleans = getBooleans(
() => true,
() => false,
() => true
);
// booleans 的类型现在是: [boolean, boolean, boolean]注意事项
- 使用 readonly 可以防止意外修改传入的参数数组。
- ReturnType
能够准确获取函数的返回类型,即使函数有复杂的类型定义。 - 如果你的函数需要处理异步操作,可以使用 Promise
> 来处理 Promise 类型的返回值。
总结
通过使用 readonly 和映射类型,我们可以编写出更精确的 TypeScript 类型定义,从而避免类型信息丢失,提高代码的可维护性和可读性。这种方法尤其适用于处理函数参数为一组函数,并需要精确推断返回数组类型的情况。
以上就是TypeScript:保留索引推断数组类型的详细内容,更多请关注其它相关文章!
# 相关文章
# seo如何合理的布局
# 湖南seo技巧服务商
# 大连seo排名优化电话
# 惠州企业seo咨询
# 石景山网站优化收费
# 阳江市抖音推广招聘网站
# 网站建设可以找哪些公司
# 日本站关键词实时排名
# 房山集团网站建设方案
# 河南关键词排名制作流程
# typescript
# 这是一个
# 我们可以
# 适用于
# 这是
# 返回值
# 服务端
# 如何在
# 遍历
# 是一个
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
C++指针和引用有什么区别_C++内存管理核心概念深度解析
Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略
葱吃多了会怎样 葱吃多了会伤胃吗
PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符
必由学官方平台入口 必由学在线课堂登录地址
J*aScript打印功能_j*ascript输出控制
ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
J*aScript动态修改指定div内所有a标签样式指南
PHP URL参数传递与500错误调试指南
微信语音通话掉线如何解决 微信语音通话稳定优化方法
必由学登录入口 必由学官方网站在线访问链接
QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性
Pyrogram与g4f集成:异步编程实践与常见错误解决
整合Supabase认证与Django模型:跨模式迁移的解决方案
Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
C++如何实现线程池_C++11手动实现一个简单的固定大小线程池
解决Django多数据库/多Schema环境下外键迁移问题
我的世界官方游戏入口 我的世界官网平台直达链接
支付宝如何设置安全保护_支付宝安全设置的全面教程
Angular中单选按钮的正确使用与常见陷阱解析
海棠账号登录入口_登录海棠账户同步阅读记录
Python:递归比较文件夹内容并找出特定类型文件的差异
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
12306怎么选座位选到安静区_12306选座安静区域选择策略
Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
58动漫网在线官方网 58动漫网正版动漫入口网址
特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相
Django表单验证失败时保留用户输入数据的最佳实践
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示
j*a toString()的覆盖
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
J*a TimerTask中HashMap意外清空的深层原因与解决方案
Node.js 中使用 node-cron 实现定时 API 数据抓取与处理
抖音网页版平台入口 抖音网页版官网在线访问教程
微博网页版主页入口 微博官方网站免登录访问
红果短剧网页版官网入口 官方最新网址发布
sublime怎么设置启动时打开的窗口_sublime会话管理与热退出
ArrayList与LinkedList核心操作的Big-O复杂度分析
2026春节假期票务安排_2026春节放假购票指南
AO3网页版合集入口 Archive of Our Own同人作品浏览指南


2025-10-11
浏览次数:次
返回列表
-readonly [P in keyof T]: ReturnType