Typescript:通用对象映射函数

2024-05-12

对于以下类似的函数[].map但对于物体

function mapObject(f, obj) {
  return Object.keys(obj).reduce((ret, key) => {
    ret[key] = f(obj[key])
    return ret
  }, {})
}

有没有办法输入它以便以下内容有效?

interface InputType {
  numberValue: number
  stringValue: string
}

interface OutputType {
  numberValue: string
  stringValue: number
}

const input: InputType = {
  numberValue: 5,
  stringValue: "[email protected] /cdn-cgi/l/email-protection",
}

function applyChanges(input: number): string
function applyChanges(input: string): number
function applyChanges(input: number | string): number | string {
  return typeof input === "number" ? input.toString() : input.length
}

const output: OutputType = mapObject(applyChanges, input) // <-- How to get the correct 'OutputType'

这可行,但非常具体applyChanges功能

type MapObject<T> = {
  [K in keyof T]: T[K] extends number
    ? string
    : T[K] extends string ? number : never
}

function mapObject<F extends FunctionType, T>(f: F, obj: T): MapObject<T>

有更通用的解决方案吗?


里面有一个签名Typescript 2.1 发行说明 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html#partial-readonly-record-and-pick.

结合你的代码我最终得到:

function mapObject<K extends string, T, U>(obj: Record<K, T>, f: (x: T) => U): Record<K, U> {
    return Object.keys(obj).reduce((ret, key) => {
        const k = key as K;
        ret[k] = f(obj[k]);
        return ret
    }, {} as Record<K, U>)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript:通用对象映射函数 的相关文章

随机推荐

  • 使用 js-xlsx 解析 Excel 工作表

    我正在尝试解析用户指定的目录中的所有 Excel 文件 但js xlsx我正在使用的库似乎需要手动导航 var url test files test xlsx lt Located in the project directory var
  • 查看 IntelliJ Idea 中使用的 Java 类的来源

    在 Visual Studio 开发环境中 当您使用库时 如果您有相关的 pdb 则可以在调试期间深入了解它们的源代码 我想知道当你使用IntelliJ Idea IDE在Java下开发时有什么办法可以拥有这个功能吗 我想看看 hibern
  • 滚动时隐藏移动 Safari 中的地址栏 (touchOverflow)

    我想继续一些其他问题 jquery mobile如何隐藏mobile safari地址栏 https stackoverflow com questions 9798158 how does jquery mobile hide mobil
  • 在 Flask 中使用 html 运行 python 脚本

    我是 Flask 新手 我试图在单击 html 页面中的按钮时从后台运行 python 脚本 这是我的代码 from flask import from functools import wraps import sqlite3 app F
  • 重试 polly 单元测试(xunit 和 moq)

    我有 net core weabpi 参见下面的代码 我正在使用 polly 重试策略 请参阅下面的策略 我想对端点 getProducts 进行单元测试并测试 polly 重试 我已经发现这些例子 https github com App
  • 当方向改变时,视图控制器会为我做什么?

    一个简单的iphone程序 由项目模板View based Application生成 有几个按钮 我添加了以下代码 void showInfo UIView view NSLog view bounds 6 2f 6 2f 6 2f 6
  • Typescript :过滤 keyof 类型参数

    我正在使用 typescript 3 8 3 并尝试动态查找某种类型的键并使用它们来生成其他对象 我有一个Detail对象并想用它来动态生成一个Column对象仅基于类型的属性Desc 这是我想做的事情的简化代码 Model interfa
  • 如何检查 TCL 的标准输入缓冲区是否为空?

    With fconfigure http www tcl tk man tcl8 6 TclCmd fconfigure htm您可以获取和设置频道选项 buffering指定缓冲类型 默认为line for stdin 有没有办法检查缓冲
  • 我对 MVVM 模式有一些疑问

    我叫 Jes s 来自西班牙 是一名 NET 开发人员 几天前我刚刚发现了这个伟大的网络 我有一些关于 MVVM 模式的问题 如果您能回答我 我将很高兴 我三个月前开始使用 WPF 并且学习了 MVP 模式 MVP 非常好 因为您可以很好地
  • 使用编辑器模板和单选按钮

    我以表格格式显示数据 该表是在使用时自动生成的EditorFor 和 EditorTemplates 在表格的每一行中 我显示 ID 姓名 国家 地区下拉列表 爱好选择的复选框和性别选择的单选按钮 一切都工作正常 但我无法绑定性别单选按钮
  • 使用mongoid动态创建索引

    我有一项为我的文档创建新字段的工作 我想在这项工作结束时创建该字段的索引 我试过 Model index field gt 1 and also Mongoid Sessions default rating prediction ensu
  • TSQL 定义临时表(或表变量)而不定义架构?

    有没有一种方法可以定义临时表而无需预先定义其架构 实际上 使用表 VARIABLE 内存表 是最佳方法 table 在临时数据库中创建一个表 而 table 是全局的 两者都具有磁盘命中 考虑交易数量所经历的放缓 打击 CREATE PRO
  • 如何计算持续时间?

    我正在开发一个基于网络的应用程序来从系统日期时间捕获开始时间和结束时间 但我的主要问题是我不知道如何获取停机时间的开始时间和结束时间之间的持续时间 Function to get current start time var startTi
  • 规范“毒”方式真的值得吗? (3NF)

    我正处于数据库设计的早期阶段 所以还没有最终的结果 并且我正在为具有可选标签的线程使用 TOXI 3表设计 但我忍不住觉得加入是并不是真的必要 也许我只需要依赖我的简单标签列posts我可以在其中存储类似 varchar 的表
  • System.Web.HttpException 无法加载类型“[命名空间].???”

    这开始于无法加载类型 全局 错误 在我尝试了一些方法后 没有找到删除 Global asax 文件的位置 现在错误是无法加载类型 namespace 在哪里 是我尝试加载的每个页面的类名 该网站 在 VS2008 本地开发计算机中执行时 工
  • 使用 lambda 作为模板参数时出现的编译器错误是什么?

    Edit 这已被报告为 Microsoft Connect 上的 VS2012 C 编译器错误 link https connect microsoft com VisualStudio feedback details 788426 vs
  • 使用 django-filters 设置初始值?

    当使用Django 过滤器 https django filter readthedocs orgapp 如何设置过滤器中字段的初始值 通常采用标准形式Django 例如一个简单的选择列表形式 class MyForm forms Form
  • 如何将任意颜色的色度键滤镜应用到实时摄像头源ios?

    基本上我想将色度键滤镜应用到 ios 实时摄像头源 但我希望用户选择将被另一种颜色替换的颜色 我找到了一些使用绿屏的示例 但我不知道如何动态替换颜色而不仅仅是绿色 知道如何以最佳性能实现这一目标吗 您之前曾询问过我的情况GPUImage h
  • iOS 以编程方式撤销位置服务权限

    有没有一个功能CLLocationManager or UIApplication撤销位置权限类似功能unregisterForRemoteNotifications撤销推送通知权限 The stopUpdatingLocationCLLo
  • Typescript:通用对象映射函数

    对于以下类似的函数 map但对于物体 function mapObject f obj return Object keys obj reduce ret key gt ret key f obj key return ret 有没有办法输