如何使用打字稿中的查找来推断类型化的mapValues?

2023-11-21

如同:

如何从打字稿中的动态键数组推断类型化数组?

我正在寻找一个通用对象,该对象接收任意键的映射以查找值,并返回具有键入值的相同键(如键入的 _.mapValues)。

从对象获取单一类型属性的能力已被记录并且有效。对于数组,您需要将重载硬编码为类型化元组,但对于对象,我收到“重复字符串索引签名”错误。

export interface IPerson {
    age: number;
    name: string;
}

const person: IPerson = {
    age: 1,
    name: ""
}

function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
    return o[name];
}

const a = getProperty(person, 'age');
// a: number

const n = getProperty(person, 'name');
// n: string

function getProperties<T, K extends keyof T>(obj: T, keys: { [key: string]: K }) {
    const def: { [key: string]: T[K] } = {};
    return Object.entries(keys).reduce((result, [key, value]: [string, K]) => {
        result[key] = getProperty(obj, value);
        return result;
    }, def);
}

const { a2, n2 } = getProperties(person, {
    a2: 'name',
    n2: 'age'
});

// Result:
// {
//     a2: string | number, 
//     n2: string | number
// }

// What I'm looking for:
// {
//     a2: string, 
//     n2: number' 
// }

如何用打字稿实现这一点?


只要它在运行时工作,您就可以can告诉 TypeScript 如何使用重命名键映射类型:

type RenameKeys<T, KS extends Record<keyof KS, keyof T>> = {[K in keyof KS]: T[KS[K]]};

function getProperties<T, KS extends Record<keyof KS, keyof T>>(
    obj: T,
    keys: KS
): RenameKeys<T, KS> {
    const def = {} as RenameKeys<T, KS>;
    return (Object.entries(keys) as Array<[keyof KS, any]>)
      .reduce((result, [key, value]) => {
        result[key] = getProperty(obj, value);
        return result;
    }, def);
}

这应该像您在类型系统中所期望的那样运行。亮点:类型keys给出一个名为的类型参数KS,这被限制为Record<keyof KS, keyof T>,这或多或少意味着“我不关心键是什么,但属性类型必须是来自T”。那么,RenameKeys<T, KS>走过的钥匙KS并从中提取财产类型T与他们有关。

最后,我需要做一些类型断言......def is RenameKeys<T, KS>。的类型value in [key, value]我刚刚做了any,因为类型系统很难验证这一点result[key]将是正确的类型。所以这有点捏造了实现类型的安全性......但是调用者getProperties()应该高兴:

const {a2, n2} = getProperties(person, {
  a2: 'name',
  n2: 'age'
});
// a2 is string, n2 is number.

Playground 代码链接

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

如何使用打字稿中的查找来推断类型化的mapValues? 的相关文章

随机推荐

  • 如何从整数中删除第一个数字?

    我需要输入一个数字 例如 200939915 完成此操作后 我知道如何操作 我需要删除第一个数字 使其变为 00939915 做这个的最好方式是什么 char c 200939915 char d c 1
  • 使用 Auth0 登录成功,但仍然返回 401“访问被拒绝”?

    我设法让 Auth0 在我的 Vue js 应用程序中发挥作用 快速入门指南非常简单 因此 我成功地使用了登录功能 并收到了 Auth0 登录对话框的提示 我使用我的谷歌帐户进行快速登录 这也有效 我的 Google 帐户现在在我的 Aut
  • JavaScript 通过 className 获取子元素

    我在 Javascript 中编写了以下行 var eleCategory document getElementById cmbCategory 现在我想找到所有elementbyClassName包含在eleCategory元素 这样的
  • 嵌套 Async Await 不等待

    我想我误解了async await in c 我有两种返回一个的方法Task定义为 public async Task Name await AsyncOperation Imagine AsyncOperation 像一个PostAsyn
  • 如何在 Swift 中检查字符串是否包含中文?

    我想知道如何在Swift中检查字符串是否包含中文 比如我想检查里面是否有中文 var myString Hi 大家好 It s contains Chinese Thanks 这个答案 to 如何判断一个字符是否是汉字也可以很容易地翻译自
  • Google Maps Api V3 - 设置国家或城市样式

    我正在尝试制作一张地图 仅针对选定的区域 比如说国家 并去掉地图上的一些标签和内容 我找到了一个样式向导 http gmaps samples v3 googlecode com svn trunk styledmaps wizard in
  • 如何在 Notepad++ 中格式化 XML?

    I have 记事本 我得到了一些很长的 XML 代码 当我将其粘贴到 Notepad 中时 出现了一长行代码 难以阅读和使用 我想知道是否有一种简单的方法可以使文本可读 可读是指正确的选项卡代码 我可以手动完成 但我想要一个永久的解决方案
  • 如何在编译时创建带有 string_views 序列的 constexpr 数组?

    我想创建一个constexpr std array
  • Boost Asio 和 OpenSSL 1.1.0

    我目前正在开发一个 C IMAP 库 以便我可以提高一些公认的生疏的 C 技能 我想让这个库尽可能便携 这样我就可以跨操作系统使用它 如果我觉得疯狂 甚至可以在移动设备上使用它 为此 我做了一些研究并决定使用 Boost 的 Asio 库
  • 如何在 Blackberry 中安排特定线程

    我想以特定的时间间隔自动安排线程 我还需要在后台连续执行此操作 而不会挂起设备 我已经使用应用程序管理器类尝试过此操作 但它用于应用程序调度 我需要在应用程序内调度线程 我会用定时任务 public class MyScreen exten
  • 启用操作栏后退按钮,如硬件后退按钮

    我的一个活动中有很多片段 我从其中一个片段转到某些活动 有两种情况 如果我按下硬件后退按钮 我将返回到调用当前活动的片段 但是使用操作栏后退按钮 前一个活动是从 onCreate 状态启动的 就像我第一次启动该活动时使用的第一个片段一样 以
  • 在 matplotlib 颜色条中隐藏每个第 n 个刻度标签的最简洁方法?

    我的水平颜色条上的标签太靠近 我不想进一步减小文本大小 cbar plt colorbar shrink 0 8 orientation horizontal extend both pad 0 02 cbar ax tick params
  • 如何在 ember.js 服务中注入 store

    我尝试从初始化程序注入存储 但没有成功 所以我在服务中使用 init 查找 但我不太喜欢它 我宁愿将事物分开并将注入放在初始化程序中 余烬 1 11 1 余烬数据 1 0 0 beta 16 1 jQuery 1 11 2 不工作 初始化器
  • 从 firebase 快照中选择随机值

    我正在使用 firebase 的 foreach 从该 url 获取树中的每个子项 目标 当页面加载时 从 firebase 中抓取一个随机项目并显示它 数据结构 grabbit table name active for active i
  • 在应用程序内创建 PDF/Word (Doc) 文件

    是否有一种确定的方法可以在应用程序中创建 PDF 或 MS Word 文档文件并立即通过电子邮件发送 也可能存储它 我已经尝试了一段时间并找到了JAVA库 apwlibrary和iText 但他们都不提供任何类型的教程 有人能指出我正确的方
  • 如何使用彩色项目的背景自定义ListView?

    我创建了一个ArrayList
  • 如何在android中开发pdf阅读器[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我们非常想开发一个 pdf 阅读器 我们搜索了 api 但得到了 java api 它们是 使用小程序和 swings 编写 我们如何在 android 上运行它 或者任何人都可以提
  • 正则表达式中的前瞻是否总是无法捕获或者是否依赖?

    我一直在这个网站和网上阅读一些关于非捕获组的文章 例如http www regular expressions info brackets html and http www asiteaboutnothing net regexp reg
  • Rails 3 和苹果推送通知服务

    有人能够使用 Rails 3 向 iPhone 发送推送通知吗 轨道上的 APN and SameSoffes 插件仅适用于 Rails 2 我是 Rails 新手 我无法使它们中的任何一个工作 以下是我遇到的错误 轨道上的 APN 试图更
  • 如何使用打字稿中的查找来推断类型化的mapValues?

    如同 如何从打字稿中的动态键数组推断类型化数组 我正在寻找一个通用对象 该对象接收任意键的映射以查找值 并返回具有键入值的相同键 如键入的 mapValues 从对象获取单一类型属性的能力已被记录并且有效 对于数组 您需要将重载硬编码为类型