首页 > web前端 > js教程 > 正文

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

DDD
发布: 2025-10-11 12:48:33
原创
537人浏览过

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]
登录后复制

代码解释:

纳米搜索
纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 30
查看详情 纳米搜索
  1. T extends readonly unknown[] | []: 这里使用了 readonly unknown[],确保传入的参数是一个只读数组。 | [] 允许不传参数。这保证了我们传入的参数是一个元组类型,而非一个简单的数组类型。

  2. { -readonly [P in keyof T]: ReturnType<T[P]> }: 这是一个映射类型,用于将 T 中的每个元素的类型转换为其对应的返回类型。

    • keyof T 获取 T 中所有键的联合类型。
    • P in keyof T 遍历 T 中的每一个键。
    • ReturnType<T[P]> 获取 T[P] (即函数) 的返回类型。
    • -readonly 移除 readonly 修饰符,使得返回的数组不再是只读的。
  3. (...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<T[P]> 能够准确获取函数的返回类型,即使函数有复杂的类型定义。
  • 如果你的函数需要处理异步操作,可以使用 Promise<ReturnType<T[P]>> 来处理 Promise 类型的返回值。

总结

通过使用 readonly 和映射类型,我们可以编写出更精确的 TypeScript 类型定义,从而避免类型信息丢失,提高代码的可维护性和可读性。这种方法尤其适用于处理函数参数为一组函数,并需要精确推断返回数组类型的情况。

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

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号