首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从对象数组中提取字符串并集

从对象数组中提取字符串并集
EN

Stack Overflow用户
提问于 2019-01-02 16:23:56
回答 1查看 489关注 0票数 5

我有以下对象

代码语言:javascript
运行
AI代码解释
复制
[{
    "key": "a1",
    ...
}, {
    "key": "a2",
    ...
}, ...]

可以从这个对象中提取联合类型"a1" | "a2" | ...吗?我知道可以使用tuple API从['a1', 'a2', ...]中提取它,这是在TypeScript String Union to String Array中介绍的,但是我不能为对象数组解决这个问题

EN

回答 1

Stack Overflow用户

发布于 2019-01-02 16:57:04

基本上,您只需要对数组元素的"key"属性执行lookup,其中可以通过查找数组的number属性来找到数组的元素。不幸的是,困难的部分是让它显示为任何东西而不是"string"

代码语言:javascript
运行
AI代码解释
复制
const val = [{ key: "a1" }, { key: "a2" }]; // Array<{key: string}>
type ValueAtKey = (typeof val)[number]["key"]; // string 

这是因为编译器推断val只是一个具有string值的对象数组。编译器使用一些启发式方法来确定when to widen literals,在上面的例子中,确切的字符串文字被扩展为string

TS3.4+的更新

对于TypeScript 3.4,让编译器推断对象/数组文字的最具体类型的推荐方法是使用const assertion

代码语言:javascript
运行
AI代码解释
复制
const val = [{ key: "a1" }, { key: "a2" }] as const;
// const val: readonly [{  readonly key: "a1"; }, { readonly key: "a2"; }] 
type ValueAtKey = (typeof val)[number]["key"]; // "a1" | "a2" 

原始版本TS3.4之前的答案

在TS3.4之前,你必须做一些其他的事情。提示编译器像"a1"这样的值应该缩小到"a1"而不是扩大到string的一种方法是使值与类型constrained匹配到string (或包含它的联合)。下面是我有时用来做这件事的助手函数:

代码语言:javascript
运行
AI代码解释
复制
type Narrowable = 
  string | number | boolean | symbol | object | 
  null | undefined | void | ((...args: any[]) => any) | {};

const literally = <T extends { [k: string]: V | T } | Array<{ [k: string]: V | T }>,
  V extends Narrowable>(t: T) => t;

literally()函数只返回它的参数,但是类型往往更窄。是的,它很丑陋。

现在您可以执行以下操作:

代码语言:javascript
运行
AI代码解释
复制
const val = literally([{ key: "a1" }, { key: "a2" }]); // Array<{key: "a1"}|{key: "a2"}>
type ValueAtKey = (typeof val)[number]["key"]; // "a1" | "a2" 

val对象在运行时是相同的,但TypeScript编译器现在将其视为{key: "a1"}{key: "a2"}类型的值数组。然后,为ValueAtKey完成的查找就会给出您正在寻找的联合类型。

(请注意,我假设您并不关心这里val的顺序。也就是说,您可以将其视为数组而不是tuple。由于联合类型"a1" | "a2"没有固有的顺序,因此数组应该足够了。)

Playground link to code

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54009764

复制
相关文章
java命令不是内部或外部命令_运行cmd不是内部或外部命令
在生成Java头文件时报错,经查询发现新版的Java不使用javah的命令了,而是使用javac -h 用法:
全栈程序员站长
2022/11/08
1K0
win10配置java环境变量,解决javac不是内部或外部命令等问题
1.安装JDK,安装过程中可以自定义安装目录等信息,例如选择安装目录为D:\java\jdk1.5.0_08;
bear_fish
2018/09/19
4.6K0
win10配置java环境变量,解决javac不是内部或外部命令等问题
pytest重试_pytest不是内部或外部命令
要重新运行所有测试失败的用例,请使用--reruns命令行选项,并指定要运行测试的最大次数:
全栈程序员站长
2022/09/16
5680
nodejs在cmd提示不是内部或外部命令解决方法
今天用cmd安装个库,结果发现node不是内部命令,于是搜索了下解决方法,发现原来我上次重装nodejs换了个安装位置,path环境变量忘改了. 找到变量值中node的安装地址,比如C:develop\nodejs,如果不是这个地址改成现在新的安装的地址,然后保存,重新打开cmd,输入 node -v 查看版本号,就会发现一切正常啦!当然这只针对于安装过node的一些情况.
吴裕超
2022/05/10
1.9K0
nodejs在cmd提示不是内部或外部命令解决方法
win10配置java环境变量,解决javac不是内部或外部命令等问题「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/140138.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/24
6980
win10配置java环境变量,解决javac不是内部或外部命令等问题「建议收藏」
java环境配置 | cmd命令 java正常,javac不是内部或外部命令
ava环境配置 | cmd命令 java正常,javac不是内部或外部命令 对Java一窍不通的初学者,正准备准备参照着网上的文档配置Java环境。费了九牛二虎之力是装好了,环境也配好了。cmd窗口验证java -version显示正常,输入javac -version提示"javac不是内部或外部命令,也不是可运行的程序"。全网搜索到的信息基本一致。但是最后都没什么卵用。重装卸载N次,依然不得想要的结果。
卢衍飞
2023/02/13
7640
java环境配置 | cmd命令 java正常,javac不是内部或外部命令
telnet不是内部或外部命令怎么办[通俗易懂]
命令提示符下执行telnet,提示:’telnet’ 不是内部或外部命令,也不是可运行的程序或批处理文件。Win7,Win10系统环境下,Telnet客户端默认是关闭状态。
全栈程序员站长
2022/11/09
10.2K0
telnet不是内部或外部命令怎么办[通俗易懂]
解决 javac不是内部或外部命令等问题
1、JAVA_HOME值为: D:\Program Files\Java\jdk1.7.0_11(JDK的安装目录)
week
2018/08/24
5700
解决 javac不是内部或外部命令等问题
vue人脸识别_vue不是内部或外部命令
vue报错:无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
全栈程序员站长
2022/09/23
5220
vue人脸识别_vue不是内部或外部命令
使用xshell时显示wget不是内部或外部命令
刚才在捣鼓xshell。上面的小图标是红色的,就是我画的小红色圆圈里的,正常的时候是绿色的,如果出现红色,就说明有问题了。
纯情
2023/04/26
1.2K0
使用xshell时显示wget不是内部或外部命令
webpack的性能优化_webpack不是内部或外部命令
webpack版本过高,会出现很多问题,因此可以降低版本高度 1.可以直接覆盖原版本,全局安装可以输入`cnpm i webpack 需要降低的版本 -g,局部去掉-g即可 比如我们要降低到’3.6.0’
全栈程序员站长
2022/09/22
5040
‘java‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件「建议收藏」
配置JAVA环境变量如下: 1.下载安装jdk 2.安装完成后,右击“我的电脑”,点击“属性”; 3.选择“高级”选项卡,windows 7选择左边的“高级系统设置”,点击“环境变量”;
全栈程序员站长
2022/09/13
2.7K0
‘java‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件「建议收藏」
cmd命令ping不是内部或外部命令_ping命令次数
介绍ping命令是一个用来测试能不能与另一台主机交换数据包的命令,通常我们会用ping命令测试域名可达性。
全栈程序员站长
2022/11/08
1.8K0
电脑ping命令显示不是内部命令_cmd一直ping的命令
在cmd中用PING命令时,出现’Ping’ 不是内部或外部命令,也不是可运行的程序或批处理文件。
全栈程序员站长
2022/09/29
2.4K0
[1200]yarn不是内部或外部命令,也不是可运行的程序
第1步:找到你刚才安装的yarn 如:C:\soft\nvm\npm\node_modules\yarn\bin
周小董
2023/10/10
1.9K0
[1200]yarn不是内部或外部命令,也不是可运行的程序
出现 “java”不是内部或外部命令,也不是可运行程序或批处理文件的问题
可能的情况就是: 安装其他程序的时候,path变量被修改了,导致java命令找不到了,这个时候只有重新在path中设置java的bin目录路径就可以了
兮动人
2021/06/11
2.3K0
出现 “java”不是内部或外部命令,也不是可运行程序或批处理文件的问题
'telnet' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  系统中的telnet客户端是关闭状态。即Win10默认没有安装telnet功能。
黑泽君
2019/02/26
2.6K0
'mysql' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
1、C:\Users\Aiyufei>mysql -h 127.0.0.1 -u root 'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件。
别先生
2018/10/25
6.9K0
'mysql' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
‘vue’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
获取下载的包路径信息 npm config get prefix 将路径设置到系统环境变量
kirin
2020/06/18
6.6K0
'wepy' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
在学习安装wepy创建项目的时候,开启实时编译,出现了这样的一个报错: 'wepy' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
王小婷
2019/03/06
3.1K0
'wepy' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

相似问题

通过分支google云平台过滤构建步骤

217

GCP云构建可选步骤

11

如何将Google Drive下载输出流保存为文件?

16

Google构建条件步骤

26

找不到工件-云构建器步骤失败(Google cloud Builder)

17
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档