类型定义,用于比较(和更新)Typescript中对象的某些字段

某些用户

我想比较并分配两个对象的某些字段,让我们说:

const left = { a: 1, ignored: 5, something: 7 };
const right = { a: 2, ignored: 6, else: 8, id: 18 };

我想在leftToRight(left, right, ['a'])之后致电right

{ a: 1, ignored: 6, id: 18 }

我想调用其他函数并传递right.id,我知道第二个参数上确实存在。

我当前的方法是:

leftToRight(left, right, keys) {
  let changed = false;
  
  for (const key of keys) {
    if (!Object.is(left[key], right[key])) {
      right[key] = left[key];
      changed = true;
    }
  }

  doSomething(right.id)

  return changed
}

我正在努力寻找合适的类型定义:-(

初始方法:

leftToRight<T>(left: T, right: T, keys: Array<keyof T>): boolean

导致:“类型'T'上不存在属性'id'”,我发现没有办法检查此('id' in right

第二次尝试:

leftToRight<T>(left: T, right: T & {id: number}, keys: Array<keyof T>): boolean

导致“无法将类型'T'分配给类型'{id:number;}' right[key] = left[key]

第三次尝试:

leftToRight<T, U extends {id: number}>(left: T, right: U, keys: Array<keyof T & keyof U>): boolean

再次导致分配错误,right[key] = left[key]因为类型T和U可能完全不相关。

可爱的女皇

编辑:

你已经澄清你的要求说,LeftRight可能各有其不存在于其他属性。为了处理这种情况,我们需要两种通用类型。

Right是包含的对象id我们希望所选键同时出现在两个键中LeftRight并且希望它们具有相同的值类型。我将通用定义Keys为的任何键子集Right我定义LeftRight包含所有这些键的子集

function leftToRight<Right extends {id: number}, Keys extends keyof Right>(
  left: Pick<Right, Keys>, right: Right, keys: Keys[]
) {
  let changed = false;
  
  for (const key of keys) {
    if (!Object.is(left[key], right[key])) {
      right[key] = left[key];
      changed = true;
    }
  }

  doSomething(right.id)

  return changed
}

游乐场链接

原始答案:

在找到有效的方法之前,我尝试了一些方法。当然,这不是最明确的定义。使用泛型描述Left和添加idget时出现错误Right,但从工作中删除Right

我们说这Right是一个具有{id: number}属性的对象,并且Left必须具有Right以外的所有属性id为了让的元素keys是存在于两个对象,我们需要忽略关键idkeyof Right

function leftToRight<Right extends {id: number}>(
  left: Omit<Right, 'id'>, right: Right, keys: (Exclude<keyof Right, 'id'>)[]
) {
  let changed = false;
  
  for (const key of keys) {
    if (!Object.is(left[key], right[key])) {
      right[key] = left[key];
      changed = true;
    }
  }

  doSomething(right.id)

  return changed
}

游乐场链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TypeScript定义用于合并对象,但阻止对象属性中不同类型的合并

TypeScript:用于通过键和值更新对象的函数参数类型

类型定义规则,用于检测重复对象(例如,多语言字段)中缺少的属性

TypeScript中对象文字中的类型定义

更新锚中定义的对象字段

Typescript 中对象类型定义的区别

用于检查对象数组中某些字段的Chai断言

Firestore 仅保存自定义对象中的某些字段

类型“键”不能用于索引 TypeScript 中的类型“对象”

自定义卷积和keras自定义层中的无类型对象用于门操作

TypeScript:缩小对象字段的类型

在Typescript / Javascript中更新嵌套对象中的字段

比较数组中的对象并删除重复项和更新-Javascript

类型提示用于正在定义的类型的对象

更新嵌套对象中的某些字段而不用扩展运算符覆盖其他字段

如何在Angular Typescript中的对象数组中提取对象的某些字段

在TypeScript中定义类型安全的通用对象访问器函数

在TypeScript中定义一个空的对象类型

TypeScript中带有对象的数组的类型定义

根据列表中对象的属性定义Typescript类型

无法以某些自定义方式排列和打印网页中的某些字段

比较 id 字段上相同类型的 2 个对象,以便我知道更新或保存该对象

来自Typescript中对象的键和值的类型

TypeScript中的类和对象文字之间的类型检查

将可比较的值类型 Int 应用于 Swift 4 中的 UIImage 对象

Typescript中的比较器,用于对数组进行自定义排序

用于promise.reject的TypeScript类型定义

如何更新现有对象中的类类型和方法

Prisma:字段...未在...输入类型或类型中定义...预期,但非对象已提交