如何从对象中省略“删除”许多属性?

2023-12-23

我有两种返回以下类型的方法Pick<T, K> and Omit<T, K>省略号在哪里type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>。在从对象中删除多个属性时,我遇到了一些麻烦。

我有一个方法pickOne从对象中选择一个属性,一种方法pickMany从一个对象中选取多个属性的方法,以及从对象中删除一个属性的方法 omitOne。我想要一个 OmitMany 方法来从对象中删除多个属性,但在修复该方法中的类型错误时遇到了困难。

实施方法:

export let pickOne = <T, K extends keyof T>(entity: T, props: K ): Pick<T, K> => {
    return { [props] : entity[props] } as Pick<T, K>
}

export let pickMany = <T, K extends keyof T>(entity: T, props: K[]) => {
   return props.reduce((s, prop) => (s[prop] = entity[prop], s) , {} as Pick<T, K>)
}

export let omitOne = <T, K extends keyof T>(entity: T, prop: K): Omit<T, K> => {
    const { [prop]: deleted, ...newState} = entity
    return newState
}

// And the OmitMany for so far I tried, the problem is with storing the entity
// in a temporary variable. This function only omits the last property in the
// the array. I would like an implementation simular to pickMany.
export let omitMany = <T, K extends keyof T>(entity: T, props: K[]): Omit<T, K> => {
    let result = entity as Omit<T, K>
    props.forEach(prop => {
        result = omitOne(entity, prop)
    })
    return result
}

我期望的输出omitMany({x: 1, y: 2, z: 3, r: 4}, ['x', 'y'])成为类型的对象{z: number, r: number},但正确知道输出是类型的对象{x: number, z: number, r: number}


你的问题与打字稿关系不大。这些类型按照您的预期工作omitMany,唯一的问题是在运行时它不会删除您期望的所有属性,这是由于您调用omitOne on entity而不是之前的结果。不幸的是,这需要一些类型断言,但它会起作用:

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>

let omitOne = <T, K extends keyof T>(entity: T, prop: K): Omit<T, K> => {
    const { [prop]: deleted, ...newState } = entity
    return newState
}

let omitMany = <T, K extends keyof T>(entity: T, props: K[]): Omit<T, K> => {
    let result = entity as Omit<T, K>
    props.forEach(prop => {
        result = omitOne(result, prop as unknown as keyof Omit<T, K>) as Omit<T, K>
    })
    return result
}

let o = omitMany({ x: 1, y: 2, z: 3, r: 4 }, ['x', 'y'])
console.log(o)

操场 https://typescript-play.js.org/#code/C4TwDgpgBA8gtgS2AHgCoBooGkB8UC8UACggMYDWamAogB6kA2ArgCYTLkQgD2AZlBmw4cAKBEMIwKN0TAYAO2iEq2KBFrAI8lgGconHv1Q4AFFuBIQALgGYwAJ25gbWAJQ34SFbgJ4A3iJQQVCk3PI6Un5QANoOTgC6NmwSmiyYAHSZigDuAMrAAIaaUAC+BGryFqCBwfaSTPbyUDn5RRAiJWIp0rIAsgXyIOXeahpauvpcfAKm5pY2gnFgOi7R8e6wst54+P41Qd11OkwMUoRzoFAFep4ogrj7UEs66bzc9tQFpAAWJku+UACwWBUCOJzOPSQCggJjBpzsjjAVz0THk5Hk3GyTWuk0Mmy89xwrmR+LumAewJKrkedWADSacOAHS6kmk5RkSH6gxMUVoNgAjJhrFAAEyYABeNgAzJh7DYACylTDRADktBVmBVIBV6xEoXC3Ak6QY3AA5iZuK4gA

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

如何从对象中省略“删除”许多属性? 的相关文章

随机推荐

  • Golang XML:解组忽略名称空间

    我正在 Go 系统中实现一项从外部 SOAP 服务读取数据的服务 现在我正在为其编写测试 我遇到了这个问题 unable to unmarshal request body for testing expected element type
  • CALayer 优化?

    我添加了几个 CALayer 作为 UIView 层的子层 每层的内容是从服务器下载的不同图像 每个图层都从屏幕外动画到随机生成的位置 图像数据是异步下载的 每个图像大约为 300x300 或更小 由于随机放置 图层重叠 有些图层被上面的图
  • Visual Studio 2010 - 如何强制项目引用使用确切路径而不是 GAC 或程序文件?

    我们永远都会遇到这个问题 我们有很多解决方案和一个相邻的 Components 文件夹 我们要引用的所有 DLL 都在这个文件夹中 其中一些是我们从源代码构建的 以使用仅存在于组件二进制文件中的特定版本号 但是当不同计算机上的用户从 TFS
  • SQL DATE 与 java.sql.Date 中的时区

    我对 SQL DATE 数据类型与 SQL DATE 数据类型的行为感到有点困惑java sql Date 以下面的语句为例 select cast as date in most databases select cast as date
  • 收到 kotlin 错误“等待 60000 毫秒后,测试协程未完成”

    我是测试新手 试图获取第二个流量值并断言它 当我逐个运行此测试时运行良好 但是当我运行整个测试时 第一个测试运行良好 其余测试给我超时错误 Error After waiting for 60000 ms the test coroutin
  • 获取 Android .apk 文件 VersionName 或 VersionCode 而不安装 apk

    下载后 如何以编程方式从 AndroidManifest xml 文件中获取我的 apk 的版本代码或版本名称 而不安装它
  • 序列化 JavaFX 组件

    我正在尝试在 Java FX 下开发一个小型拖放应用程序 用户将按钮 菜单 标签等 JFX 组件放在某些位置 完成后 他将保存此布局 稍后他将重新打开该布局并再次使用它 存储掉落到某个位置的所有物体的信息很重要 我决定为此目的使用序列化 但
  • 在Xcode4中查找变量或方法的所有引用

    有一个类似的问题here https stackoverflow com questions 2831845 xcode view references for a variable但我无法利用 XCode 4 中的答案 我用谷歌搜索了它
  • 在后台使用非托管库时无法更新 WPF GUI

    我在尝试使用 Emgu 从网络摄像头捕获图像时遇到了问题 为了完成此任务 Emgu 使用非托管 opencv 库 所以问题是我无法从 System Timers Timer Elapsed 事件更新我的 GUI WPF 图像控件 我知道它在
  • 使用 d3 画布强制定向图多条边

    我创建了具有多个边的强制有向图 但在渲染后它仅显示 其他一个相互重叠 我想创建类似的东西https bl ocks org mattkohl 146d301c0fc20d89d85880df537de7b0 index html https
  • Users.threads.list() 中缺少很多线程

    我正在使用 Users threads list 方法通过查询 in sent newer than 1y 从我的 GMail 帐户检索线程 结果的第一页 100 个线程 看起来不错 其中包含 2014 年 12 月和 2015 年 1 月
  • 如何在laravel中使用不同的redis连接

    我正在创建一个 laravel 包 在这个包中我需要在 redis 中保存一些数据 但我希望这个包使用不同的 redis 连接 这样如果他们可以在包的配置文件中设置 redis 详细信息凭证 并将使用此连接这个包 我想给包用户自由使用不同的
  • 使用 JAVA API 获取我的 Azure 订阅中所有资源的详细信息

    我正在寻找类似的东西this https stackoverflow com questions 17584084 get a list of all resources in my azure subscription powershel
  • 菜单栏右侧的摆动菜单项

    我有一个 swing 应用程序 在 JFrame 的菜单上我想添加一个帮助菜单项 但要使其右对齐 有任何想法吗 Swing JMenuBar 有一个 BoxLayout 我尝试过 menuItem new JMenuItem Help me
  • program.exe:Native' 已退出,代码为 255 (0xff)

    我正在使用 boost 线程 并且在使用 MD 编译时一切正常 但我真的更喜欢使用 MT 编译 然后我遇到的问题是program exe Native 已退出 代码为255 0xff 这发生在这条线上 thread 1 线程 testThr
  • 基准代码 - 除以迭代次数?

    我和我的朋友就 C C 代码 或一般代码 的基准测试进行了有趣的讨论 我们编写了一个简单的函数 它使用getrusage测量给定代码段的 CPU 时间 它测量运行特定功能所花费的 cpu 时间 让我举一个例子 const int itera
  • 检测 Android 模拟器何时完全启动

    我想创建一个脚本 在其中启动模拟器 并在系统完全启动后安装 apk 我如何知道模拟器何时完全启动以便我可以运行安装命令 这里http developer android com guide developing tools adb html
  • 使用 .prop(hidden: true) 在 JQuery 中隐藏按钮

    我试图弄清楚如何使用 prop hidden true 方法使用 JQuery 隐藏按钮 由于某种原因 在 Chrome 中 当我设置此值并查看 html 时 该按钮有一个隐藏元素 但该按钮仍然在页面上显示为可见 有任何想法吗 按钮没有隐藏
  • 从 Azure AD OAuth v2 令牌端点获取 client_credentials 令牌时,sub 和 oid 声明中包含什么内容?

    我可以在设置密钥 秘密后获取这些令牌 但我不知道是否或如何依赖我的应用程序中的子声明 有关更多背景信息 我的应用程序实际上是 B2C 注册应用程序 我将转到 B2C 租户中的 v2 端点 但没有指定策略来 使用客户端凭据流 可能会导致常规
  • 如何从对象中省略“删除”许多属性?

    我有两种返回以下类型的方法Pick