将字符串数组转换为打字稿中的对象键

2023-11-24

我有下一个数组

const arrayData = ['a', 'b'] as const;

该数组有下一个类型 ArrayType = ('a' | 'b')[];

我想获得与下一个类型一致的对象:

type Type = {
  a: boolean,
  b: boolean,
}

预期对象

   const result : Type = {
     a: false,
     b: false,
   }

我要变身arrayData to result

const result: Type = arrayData.reduce((r, key) => {
  return {
    ...r,
    key: false,
  }
}, {});

但这段代码没有有效的类型


您的第一个假设是错误的:

const foo = ['a', 'b'] as const; // Type is ['a', 'b'], a tuple of literals
const bar = ['a', 'b'];          // Type is ('a' | 'b')[], a list of a union of literals

使用['a', 'b']不管const你可以这样输入:

type ObjectFromList<T extends ReadonlyArray<string>, V = string> = {
  [K in (T extends ReadonlyArray<infer U> ? U : never)]: V
};

操场上的完整示例

解释:

  • T extends ReadonlyArray<string>需要一个类型参数,该参数是一个数组,其中的元素可以变成字符串,只读允许您使用const。每个字符串文字类型都可以传递到字符串中。
  • T extends ReadonlyArray<infer U> ? U : never是一个条件条件,意思是:“如果 T 是一个数组,则获取其元素的类型(U),否则没有类型”。
    我们需要 T 来扩展一个数组,所以我们可以设置 never after:这意味着我们知道它永远不会发生。infer U将推断 T 可能的最小类型集,在您的情况下是字符串文字的并集 ('a' | 'b')
  • [K in ...]: V使用数组元素中所有可能的值作为指向 type 值的键V(我们将默认值设置为string,但您可以通过另一个)。

最后,关于减少。您需要设置迭代期间正在使用的类型:

const result: Type = arrayData.reduce((r, key) => {
  return {
    ...r,
    [key]: false,
  }
}, {} as Type); // Here

要精确限制类型,您需要通过输入初始累加器来输入reduce,并输入函数的返回值:

const result: Type = arrayData.reduce((r, key): Type /* HERE */ => {
  return {
    ...r,
    [key]: false,
  }
}, {} as Type);

操场上的完整示例

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

将字符串数组转换为打字稿中的对象键 的相关文章

随机推荐

  • 树莓派自动登录无需etc/inittab

    我想将我的 Raspberry Pi 设置为以特定用户自动登录 我用谷歌搜索了这个 我找到的解决方案是关于编辑 etc inittab 文件 我的问题是现在我没有该文件 它在我的 Raspbian 版本中似乎丢失了 还有其他方法可以做到这一
  • 相当于 X11 中的“无效矩形”/“WM_PAINT”

    我正在将一些代码从 Windows 移植到 XLib 在Windows代码中 我可以通过调用强制重绘InvalidateRect然后处理相应的WM PAINT信息 但是 我无法找到如何在 X11 XLib 中执行此操作 我看到有一个Expo
  • 使用 javascript 将内容添加到表格行 ()?

    我有一个表如下 table tr td col 1 td td col2 td tr tr td field td td Field 2 td tr tr td another field td td one more field td t
  • MySQL 从一张表更新到另一张表时条件不起作用?

    我尝试过一种似乎对其他人有效的解决方案 从表 b 更新表 a 其中 条件 我似乎无法让它工作 MySql 给了我一个语法错误 我有两个表 我需要将一个表中的一列更新为另一列的值 其中两个表中的 id 都匹配 UPDATE video dat
  • 找不到控制器方法 - laravel 4

    我在尝试运行任何控制器时收到此消息 Symfony Component HttpKernel Exception NotFoundHttpException 未找到控制器方法 我的路线文件中有此代码 Route controller Hom
  • 重新分配而不释放旧内存

    我想使用 realloc 来增加内存大小 同时保持指针不变 因为调用者使用它 realloc 并不总是这样做 有时它会返回一个不同的指针并释放旧的指针 我想 尝试 重新分配内存 如果不可能 则使用原始指针回退到不同的方法 但重新分配已经破坏
  • CodeIgniter + jQuery(ajax) + HTML5 Pushstate:如何使用真实的 URL 进行干净的导航?

    我目前正在尝试建立一个新网站 没什么特别的 漂亮又小 但我一开始就陷入困境 我的问题是干净的 URL 和页面导航 我想以 正确的方式 去做 我想要什么 我使用 CodeIgniter 来获取干净的 URL 例如 www example co
  • 在ios中重绘视图

    是否可以重绘整个视图 我需要它来完成我的语言设置 问题是语言只有在再次绘制视图后才会改变 就像您退出设置然后再次进入一样 语言也会更改 但是当你保存所有内容时 语言保持不变 那么 在发现语言更改后 我应该如何重新绘制我的视图 或者最好是整个
  • 滑动屏幕的某些部分

    I am trying to design one screen which contain some swipe part I have one screen with mapview listview and some text My
  • 使用 axios 获取本地 JSON 数据时遇到问题

    我正在尝试使用 axios 从本地 json 文件获取数据 在控制台下我什至无法得到回应 所以我想我应该在这里询问一下 js 文件 var loadData function loadData axios url filepath json
  • ASP.Net MVC 模型绑定 - 如何更改日期格式?

    我有这个应用程序 默认日期格式必须是dd MM yyyy 语言为巴西葡萄牙语 我已经将文化和 UI 文化设置为pt BR现在myDate ToShortDateString 返回我想要的日期 我可以毫无困难地展示它们 问题是 当用户在输入字
  • Yii2:如何在非 Restful API 上允许 CORS

    我正在 Yii2 Framework 上使用预构建的 API 不是 Restfull 它使用 JSON 数据进行响应 并根据用户类型和凭证令牌接受请求 现在我必须制作一个位于不同位置 域 的应用程序 这会导致 CORS 冲突 我的应用程序是
  • 如何在 matlab 中格式化复数以进行文本输出

    我有一个复数 我想使用 fprintf 命令将其输出为文本 我没有看到复数的格式规范 是否有捷径可寻 使用定点格式规范仅输出实部 根据文档fprintf and sprintf 数字转换仅打印复数的实部 所以对于一个复杂的值z你可以用这个
  • Django 错误消息“在定义中添加 related_name 参数”

    D zjm code basic project gt python manage py syncdb Error One or more models did not validate topics topic Accessor for
  • 如何处理 MS Word 添加的“特殊”字符?

    我想知道你如何清理 MS Word 中的特殊字符 例如 m 和 n 破折号以及弯引号 我经常发现自己从 Word 中复制客户端内容并粘贴到静态 HTML 页面中 但内容最终会出现奇怪的字符 因为特殊字符未转换为正确的 ACSII 代码 因此
  • 将字符串转换为 &strs 时,切片和显式重新借用之间有区别吗?

    下面两个例子等价吗 示例1 let x String new let y x 示例2 let x String new let y x 一种比另一种更有效率还是它们基本相同 如果是String and Vec 他们做同样的事情 在gener
  • Node.js/Async - 如何避免异步回调地狱?

    我是后端 Node Js 和 JavaScript Web 开发的新手 我发现回调中的回调可能会很痛苦 并且有一些模块可以避免这种情况 这些模块之一是异步的 https github com caolan async 我已阅读文档 但很难开
  • 如何在解决方案资源管理器上保留源文件夹层次结构?

    我在Linux上做了一个C 项目 我将源文件分组在许多目录中以自己组织 我使用 CMake 进行编译 每个子目录上都有一个 CMakeFiles txt srcs folderA Toto cpp Tata cpp folderB Foo
  • htaccess重写库

    我的根目录中有两个目录 dev and live 这些目录中的所有内容都有相对路径 例如 css style css or js home js 我希望能够使用 htaccess 更改根目录 以便相对路径变为 live css style
  • 将字符串数组转换为打字稿中的对象键

    我有下一个数组 const arrayData a b as const 该数组有下一个类型 ArrayType a b 我想获得与下一个类型一致的对象 type Type a boolean b boolean 预期对象 const re