是否可以在 TypeScript 中的元组上使用 Array.prototype.map(),同时保留返回类型中的元组长度?

2024-02-08

我希望如果我使用内置的map在 TypeScript 中对长度为 N 的元组执行函数,则返回类型也将是长度为 N 的元组(元素的类型可能不同,具体取决于传递给的函数)map)。相反,返回类型只是回调函数返回的任何类型的标准可变长度数组。元组的长度丢失。我编写了一个自定义函数来执行我想要的操作,但我想知道是否有更好的方法来逃避我。我正在努力提高对 TypeScript 的理解。我在代码下方添加了一个 TypeScript Playground 链接(具有相同的代码)。感谢您的帮助!

const nums = [1, 2, 3] as const;

// result1 type is string[]
const result1 = nums.map((num) => num.toString());

// so this won't compile
const result2: [string, string, string] = nums.map((num) => num.toString());

// a type assertion would work, but I'd rather not use one...
const result3 = nums.map((num) => num.toString()) as [string, string, string];

// ...because this also compiles yet the type of result4 doesn't match its value
const result4 = nums.map((num) => num.toString()) as [string, boolean, number, symbol, string, number];

// result5 type is [string, string, string]
const result5 = map(nums, (num) => num.toString());

// custom map function that yields the correct return type when used on a tuple
function map<A extends readonly [...any[]], B>(values: A, func: (value: A[number]) => B): { [K in keyof A]: B } {
    return values.map(func) as unknown as { [K in keyof A]: B };
}

See on: TypeScript 游乐场 https://www.typescriptlang.org/play?#code/MYewdgzgLgBGCuBbCMC8MDaBGANDATHgMwC6MAhiqJFANwBQ9A9EzAE4CmE8ANlFjCgBPAA4cYASxTQ2EsAHMMJetWjsuvfmjhIIAOkTkRACmMJEASjQA+HYj1QQAZSiyFxixYbNWEEIIALKRgAd3AAclhQRBEJHg4VcDVObj58AC5MGTl5PGyFPNccsnRzfUMTMyQrVFtzB2ci909vFgpBUXFKCA42KAlwUJBeABMhtgBrPAAjeFgASXCxtnIoAN64EFh4HphwDj1DxJp1VKgibTKDI1NzGrqkBpc3eQ8rSiym3Jh879+SVqsQ56aYcYDkHbiNbBcg8PwwaKxeIoIQcWBrKGdPYAM1OmgALDARiAuGBIjBDFBgAFJFAUAA3WHwBKqWApAmXXTXSp3Gx2J5fN4UFAYX4zEAgeLkMB4cygth5ISIaaSwovWVIeUAxhtdl8ACsHTEkhFYp+XzVxWOyQ0Bu0FSqyDwjvu-Mczxyb0BCJ2jkQFKMMGx8DAwH6gzWqxgQgkHB4IxQGIRIDYnDD6ig8DYYCN4hC6xzkLGg3IgngIni9GDofDOYqAB4AIIwDgADygHDACfU5GJYB4QkwwOlQiUJDwACFrMZGTxmRBMo28NXgJkZ0yOIuMHLeiRXROLJkAN6YADSkhzEw4QhAuMbJEyE5gAF8YEf6DBPxmsznZ-PucYK7vCgIYTGAIAhDmHwnhg55yDAV43neD4wE+z4MM+9BAA


请尝试下一步:


type A = readonly [1, 2, 3]

const nums: A = [1, 2, 3];
const toStr = <T extends number>(num: T) => num.toString() as `${T}`

const result2 = nums.map(toStr); // ("3" | "1" | "2")[]

我相信这不是最好的解决方案,因为你仍然有 ('3'|'2'|'1')[] 而不是 ['1','2','3'],但这是某种向前一步

我很高兴在这里看到其他解决方案。很有趣的问题)

仅适用于 T.S 4.1

UPDATE

在以下的帮助下可以创建您想要的类型超载 https://www.typescriptlang.org/docs/handbook/2/functions.html#function-overloads and 可变元组类型 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-0.html#variadic-tuple-types

type Json =
    | string
    | number
    | boolean
    | { [prop: string]: Json }
    | Array<Json>

type CustomMap<T extends ReadonlyArray<Json>> = {
    [Index in keyof T]: { elem: T[Index] }
}

function map<Elem extends Json, List extends Elem[], Return>(list: [...List], callback: (value: Elem) => Return): CustomMap<List>
function map<Elem extends Json>(list: Elem[], callback: (elem: Elem) => unknown) {
    return list.map(callback)
}

// const result2: [{
//     elem: 1;
// }, {
//     elem: 2;
// }, {
//     elem: 3;
// }]
const result2 = map([1, 2, 3], elem => ({ elem }));

操场 https://tsplay.dev/mqQDkm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 TypeScript 中的元组上使用 Array.prototype.map(),同时保留返回类型中的元组长度? 的相关文章

随机推荐

  • 如何仅在第一次启动时显示视图?

    我使用 Xcode 4 5 和故事板构建了一个应用程序 第一次启动应用程序时 我希望初始视图控制器出现 并附带必须接受才能继续的条款和条件 之后 我希望应用程序启动并跳过第一个视图控制器并转到第二个视图控制器 我知道我必须使用 NSUser
  • Android 4.3 BTLE作为服务器:如何启动广告?

    我正在尝试使用 4 3 中的新 BTLE API 在 Nexus 7 上实现 BTLE 服务器 我遇到了几个问题 首先 SDK 中没有示例 唯一的例子是针对客户的 其次 文档实际上告诉你做错误的事情 它指出 人们必须使用BluetoothA
  • 如何检测 MemoryMappedFile 是否正在使用

    在 C 4 0 中 MemoryMappedFile有几种工厂方法 CreateFromFile CreateNew CreateOrOpen or OpenExisting 我需要打开MemoryMappedFile如果存在 则从文件创建
  • Gitlab docker 和 external_url

    你好 我使用 docker 安装了最新的 gitlab 我使用 p 10080 80 和 10022 22 启动容器 我可以浏览 gitlab 并执行我需要的操作 我什至可以分别使用端口 10080 和 10022 git 克隆 http
  • 如何在android webview中启用默认突出显示菜单?

    如何在 android webview 中启用默认文本突出显示菜单 例如 复制 粘贴 搜索 共享 在 Android 1 5 2 3 上工作 您可以使用emulateShiftHeld 自 2 2 起公开 但现在已弃用 此方法将您的 Web
  • 使用 'hd' 参数限制 Google OAuth 访问一个域 (Django / python-social-auth)

    我正在构建一个内部网络应用程序供我的公司使用 并希望使用我们的 Google Apps 域来管理来自我们公司域用户名的访问 本问题的其余部分为 example com 我在用着 Django 1 9 5 python social auth
  • 如何在日期字段上显示日期选择器日历

    这是关于如何使用 jQuerydate picker在 django 支持的站点中 models py is from django db import models class holidaytime models Model holid
  • 对数组使用限制?

    有没有办法告诉 C99 编译器我访问给定数组的唯一方法是使用 myarray index 说这样的话 int heavy calcualtions float restrict range1 float restrict range2 fl
  • 为 iPhone 本地化货币

    我希望我的 iPhone 应用程序允许用户使用适当的符号 等 输入 显示和存储货币金额 NSNumberFormatter 会做我需要的一切吗 当用户切换其区域设置并且这些金额 美元 日元等 存储为 NSDecimalNumbers 时会发
  • Java 中 HTML 字符编码的转换

    我们正在尝试下载网页源代码 但是由于字符编码的原因 我们无法正确看到某些特定字符 例如 我们尝试了以下代码来转换字符串 text 变量 的编码 byte xyz text getBytes text new String xyz windo
  • React:搜索和过滤功能存在问题

    我正在开发一个组件 它应该能够 按输入搜索 使用输入字段 在触发 onBlur 事件后将调用一个函数 之后onBlur事件开始寻找 方法将运行 按所选流派过滤 用户可以从其他组件中从流派列表中选择流派 之后onClick事件启动过滤器 方法
  • 使用 Facebook 图表来获取粉丝页面的粉丝?

    我有一个粉丝页面 位于http www facebook com shop4tronix http www facebook com shop4tronix 我可以通过以下方式访问此页面上的信息 http graph facebook co
  • 文本区域 onresize 不起作用

    根据w3schools
  • 返回主菜单不断循环菜单

    当程序第一次启动时 我可以成功地从主菜单中选择任何选项 但是 当我从任何子菜单中选择 返回主菜单 选项时 它都会返回主菜单 但无论我之后再次按哪个选项 它都会继续循环该菜单 只允许我选择返回主菜单选项 如何将选择重置到不会继续循环的位置 我
  • GDB源路径

    如何让gdb使用不同的目录来查找源文件 例如 我在编译期间的源文件位于目录中 home foo bar c 接下来 我将其移动到目录中 tmp debug home foo bar c 如何强制gdb在该目录中搜索 根据这个网站 https
  • 基于有序对多关系对描述符进行排序

    我的核心数据模型的描述 项目和问题实体 项目有一个有序的一对多关系至已命名问题的问题 问题与名为parentProject 的项目具有一对一的关系 这是我获取问题的代码 let fetchRequest NSFetchRequest ent
  • 如何编写混淆矩阵

    我用Python写了一个混淆矩阵计算代码 def conf mat prob arr input arr confusion matrix conf arr 0 0 0 0 for i in range len prob arr if in
  • 如果没有 firebug 断点,jquery ajax 将无法工作

    我使用以下方法来调用 php function validateEmaiAjax email val null warning load https localhost Continental 20Tourism register ajax
  • 如何在 Cordova 中从 CDVPlugin 显示 ViewController?

    我已经为此苦苦挣扎了几天 但无法让它发挥作用 也找不到其他人似乎已经解决了这个问题 希望有人可以提供帮助 我有一个简单的 ViewController 在 Swift 的故事板中有 2 个视图 我试图通过 Cordova 插件打开它 And
  • 是否可以在 TypeScript 中的元组上使用 Array.prototype.map(),同时保留返回类型中的元组长度?

    我希望如果我使用内置的map在 TypeScript 中对长度为 N 的元组执行函数 则返回类型也将是长度为 N 的元组 元素的类型可能不同 具体取决于传递给的函数 map 相反 返回类型只是回调函数返回的任何类型的标准可变长度数组 元组的