Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何根据模式的实际值确定要在类型记录中返回的数据类型?

如何根据模式的实际值确定要在类型记录中返回的数据类型?
EN

Stack Overflow用户
提问于 2022-05-28 03:29:37
回答 1查看 41关注 0票数 0

我有这样的代码设置。

我希望返回的数据具有一个动态类型约束。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Schema = ('id' | 'name' | 'description' | 'content' | 'createdAt')[];

type Obj = {
  id: number;
  name: string;
  description: string;
  content: string;
  createdAt: Date;
}

function getBySchema(schema: Schema) {
  const result = /* Get the object of the specified field from somewhere according to the schema */
  return result;
}

const picked = getBySchema(["id", "name"]);

// Expect it to pass.
picked.name
// Expect it not to pass.
picked.createdAt

我在函数的参数类型中指定Schema以获得输入提示符。

如何根据模式的实际值动态计算结果的类型?

我尝试过以下几种方法,但是它似乎是基于模式中的所有类型来做出判断的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type PickBySchema<T extends Record<string, unknown>, S extends Schema> = S extends (infer I)[] ? I extends string  ? {
  [K in I]: T[K]
} : never : never;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-28 04:50:12

您可以使用(infer U)[] ? U : never推断传递的字符串元组,并将它们映射为结果对象键,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function getBySchema<T extends Schema>(schema: T): {
  [key in (T extends (infer U)[] ? U : never)]: Obj[key]} {

解释:

  • T extends Schema确保schema: T的传入参数为Schema类型。
  • 要使用传入的模式条目作为返回的对象键,我们首先需要使用映射类型创建一个接口,其中键派生自在中传递的Schema字符串的一个联合。为此,我们使用key in约定启动接口,该约定用于迭代一个联合类型来创建属性键。联合类型是通过扩展泛型T变量并通过使用(infer U)[] ? U : never语法推断其条目为新的联合类型来创建的,该语法获得对T有效的最小的联合类型(即传入的内容)。: never表达式用于指示,如果不能推断合并,则key将不是有效值,也不能使用。
  • 一旦导出了可能的键的合并,我们就将相应的值类型设置为Obj[key],这将确保属性值具有与键相应的正确类型。

操场链接

对代码基的进一步改进:

您不必手动键入Obj类型中的键并将它们分配给Schema类型。您可以通过以下方法实现自动化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Schema = (keyof Obj)[];

操场链接。

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

https://stackoverflow.com/questions/72415302

复制
相关文章
python中星号的意义(**字典,*列表或元组)
传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊的语法:*、** 。 调用函数时使用* ,** test(*args)中 * 的作用:其实就是把序列 args 中的每个元素,当作位置参数传进去。比如上面这个代码,如果 args 等于 (1,2,3) ,那么这个代码就等价于 test(1, 2, 3) 。 test(**kwargs)中** 的作用:则是把字典 kwargs 变成关键字参数传递。比如上面这个代码,如果 kwargs 等于 {
用户1214487
2018/01/24
3.7K0
Python中的字典遍历
备忘一下python中的字典如何遍历,没有什么太多技术含量.仅供作为初学者的我参考.
技术小黑屋
2018/09/04
2.7K0
Python中如何遍历字典
今天在写一个判断列表中的元素是否与字典中的key值相等的时候,需要用到字典的遍历,经过查阅资料,知道怎么遍历字典的key值;
bear_fish
2018/09/20
1.6K0
Python中如何遍历字典
python中列表排序,字典排序,列表中的字典排序
key= lambda dict1:dict1[0] #dict1[0]表示按键,dict1[1]表示按值。
用户8346838
2021/03/10
9.1K0
Python - 从字典列表中删除字典
字典是python的一个非常常用的功能,用于根据用户需要在其中存储数据。另一个典型的过程涉及编辑或操作此数据。要成为一名高效且快速的程序员,您必须弄清楚如何从字典列表中删除字典。有许多技术可以从词典列表中删除字典,本文将介绍这些技术。
很酷的站长
2023/08/11
2650
Python - 从字典列表中删除字典
Python中的循环:遍历列表、元组、字典和字符串
想想现实生活中的情况。你是一位在森林里测量树木的野外生物学家。你选一棵树,测量它的直径和高度,把它们写在你的笔记本上,估计它的总体积。接下来,你再选一棵树,测量它的直径和高度,把它们写在你的笔记本上,估计它的总体积。然后,你再选一棵树,测量它的直径和高度,把它们写在你的笔记本上,估计它的总体积。
deephub
2021/04/16
12.1K0
在Python中,不用while和for循环遍历列表
s1=s.encode(encoding='utf-8').decode('unicode_escape')
用户2337871
2019/07/19
5.5K0
Python: 遍历字典
遍历字典 d = {'x': 1, 'y': 2, 'z': 3} 遍历keys for key in d: print key, y x z for key in d.iterkeys(): # d.iterkeys(): an iterator over the keys of d print key, y x z for key in d.keys(): # d.keys() -> ['y', 'x', 'z'] print key, y x z 遍历value
用户2183996
2018/06/28
1.1K0
Python遍历字典
前面我们简单介绍了Python字典和Python获取字典值。今天我们来聊聊如何遍历python字典。我们还是以car为例子。下面简单介绍三种方法来遍历字典。
生信交流平台
2020/08/06
7240
python中循环遍历for怎么用_python遍历字典的值
Python 会自动将dict_1视为字典,并允许你迭代其key键。然后,我们就可以使用索引运算符,来获取每个value值。
全栈程序员站长
2022/09/22
6K0
python中循环遍历for怎么用_python遍历字典的值
Python - 删除列表中的重复字典
Python 是一个非常广泛使用的平台,用于 Web 开发、数据科学、机器学习以及自动化执行不同的过程。我们可以将数据存储在python中,以不同的数据类型,例如列表,字典,数据集。python字典中的数据和信息可以根据我们的选择进行编辑和更改
很酷的站长
2023/08/11
3651
Python - 删除列表中的重复字典
python3-列表中存储字典
# Auther: Aaron Fan #示例1: #定义几个字典 alien_0 = {"color":"green", "points":5} alien_1 = {"color":"yellow", "points":10} alien_2 = {"color":"red", "points":15} #把字典存入到列表aliens中 aliens = [alien_0, alien_1, alien_2] #遍历这个列表 for alien in aliens:    print(alien
py3study
2020/01/06
1.4K0
python3-字典中存储列表
# Auther: Aaron Fan #示例1: #存储所点披萨的信息 pizza = {    '外皮':'厚的',    '配料列表':['香菇', '奶酪'], } #概述所点的比萨 print('您点了一道"%s-外皮"的比萨信息: ' % pizza['外皮']) for 配料 in pizza['配料列表']:    print("\t%s" % 配料) #示例2: 最喜欢的语言 = {    '张三':['python','ruby'],    '李四':['c'],    
py3study
2020/01/07
1.8K0
python实用技巧:在列表,字典,集合中快速筛选数据
python中,要对列表、字典、集合进行数据筛选,最简单的方式就是用遍历,逐一对比,将符合条件的元素保存。这种方式虽然简单,但不够简洁优雅,以下用实例说明其他实现方式。 本文示例代码均用python
章鱼喵
2018/06/27
5.7K0
python列表、元组、字典
列表是由一序列特定顺序排列的元素组成的。可以把字符串,数字,字典等都可以任何东西加入到列表中,列表中的元素之间没有任何关系。列表也是自带下标的,默认也还是从0开始。列表常用方括号表示,即:[],元素用逗号隔开。
py3study
2020/01/15
1.2K0
Python中的列表、元祖、字典的区别
定义 方法 列表 可以包含不同类型的对象,可以增减元素,可以跟其他的列表结合或者把一个列表拆分,用[]来定义的eg:aList=[123,'abc',4.56,['inner','list'],7-9j] 1.list(str):将str转换成list类型,str可以使字符串也可以是元组类型2.aList.append('test'):追加元素到列表中去3.del aList[1]:删除列表中下标为1的元素del aList:删除整个列表4.cmp(list1,list2):比较两个列表的大小5.len(
py3study
2020/01/09
2.8K0
Go 语言入门系列:列表与字典及其遍历
前面的文章主要介绍了 Go 容器的数组和切片的基本概念以及使用。本文将会介绍列表与字典在 Go 语言中相关的使用,以及几种常用容易的遍历及其使用。。
aoho求索
2021/08/06
3.4K0
python 字典、列表、json转换
#!/usr/bin/python3   import json      #python字典类型转换为json对象   data = {       'id' : 1,       'name' : 'test1',       'age' : '1'   }   data2 = [{       'id' : 1,       'name' : 'test1',       'age' : '1'   },{       'id' : 2,       'name' : 'test2',       '
一朵灼灼华
2022/08/05
1.4K0
python之列表、元组、字典
3 深拷贝和浅拷贝 1 浅拷贝: 当列表中存在有个列表时,其修改这个列表中列表的某一个元素时,其他被拷贝的列表中的对应元素也将被拷贝,其在拷贝这个列表中的列表时,拷贝的是这个内嵌列表的内存位置。
py3study
2020/01/14
2.8K0
点击加载更多

相似问题

遍历python中的字典列表

21

在python中遍历字典内的列表

665

如何遍历python字典列表

21

Python -遍历列表字典

21

在列表中遍历字典

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文