当前位置: 首页 > 知识库问答 >
问题:

如何在TypeScript中根据对象传入的key返回这些key的推断?

叶越
2023-11-24

typescript,函数如何根据传入的key,返回对象对应的这些key?比如:

const obj = {    name: 'Marcelo',    age: 27,    role: ['admin']};type ObjType = {    [key in keyof typeof obj]: typeof obj[key]}const getAttr = <T extends ObjType, K extends keyof T, KS extends Array<K>>(...attribute: KS): T[KS] => {    const result = {};    for (const attr of attribute) {        result[attr] = obj[attr];    }    return result;};const attr = getAttr('age', 'name');

现在这个写法肯定不对,变量attr的推断是unknown,如何写函数getAttr的返回定义,才能让变量attr的推断为{age:number, name:string },就是函数传入了哪些key,就只返回这些key的推断

共有2个答案

朱通
2023-11-24
const obj = {    name: 'Marcelo',    age: 27,    role: ['admin']};type ObjType = typeof objtype ObjKeyType = keyof ObjTypeconst getAttr = <T extends ObjKeyType>(...attributes: T[]): { [K in T]: ObjType[K] } => {  const result = {} as { [K in T]: ObjType[K] };  for (const attr of attributes) {    result[attr] = obj[attr];  }  return result;};const attr = getAttr('age', 'name');
狄心水
2023-11-24

想到了,使用Pick就可以了,如下:

const obj = {    name: 'Marcelo',    age: 27,    role: ['admin']};type ObjType = {    [key in keyof typeof obj]: typeof obj[key]}const getAttr = <T extends ObjType, K extends keyof T>(...attribute: Array<K>): Pick<T, Array<K>[number]> => {    const result = {};    for (const attr of attribute) {        // eslint-disable-next-line @typescript-eslint/ban-ts-comment        // @ts-ignore        result[attr] = obj[attr];    }    return result as Pick<T, Array<K>[number]>;};const attr = getAttr('age', 'name');

有更好的答案,欢迎补充!

 类似资料:
  • 先上代码: 问题: 该如何定义函数testFn的data参数,才能让data的解构与DetailDataType的定义相符,并且编辑器有提示,现在data的解构全是any,如下: 求ts大神解答,谢谢!!!

  • 本文向大家介绍javascript 对象数组根据对象object key的值排序,包括了javascript 对象数组根据对象object key的值排序的使用技巧和注意事项,需要的朋友参考一下 有个js对象数组 var ary=[{id:1,name:"b"},{id:2,name:"b"}] 需求是根据name 或者 id的值来排序,这里有个风骚的函数 函数定义: 使用: 以上就是本文的全部内

  • 演示: https://tsplay.dev/NB6axN 代码: 结果: 传入 '/posts' 拿到 Promise<string[]> 传入 '/test' 拿到 Promise<number[]> 前置条件: 尽可能不要强行断言

  • type key 返回 none 表示不存在key。string字符类型,list 链表类型 set 无序集合类型…

  • 问题内容: 我讨厌以下模式: 当嵌套图表示多维结构时,此示例仅会刮擦要编写的额外代码的表面。 我确定某个地方可以避免这种情况,但是我在Google搜索中所做的努力没有任何意义。 有什么建议? 问题答案: 的 和从Java 8 有 它返回映射到键的值,或者插入给定的值;如果没有为键映射任何值,则返回null。 如果您需要懒惰的价值评估,

  • 问题内容: 因此,我尝试将Key转换为字符串,以便可以使用System.out显示它,然后将其转换回Key。我可以使用BASE64Encoder将其转换为字符串,但是在将其转换回时遇到问题。这是我的源代码: 问题答案: 您永远不会使用un-base-64您的字符串。 替换为: 与