打字稿中的相交键

arslancharyev31

我想编写一个类型安全实用工具函数,用于比较Typescript 4.0中2个给定对象的属性。我最初的尝试如下:

export function propsAreEqual<O extends object, T extends O, S extends O>(first: T, second: S, props: (keyof O)[]) {
    return props.every(prop => first[prop] === second[prop])
}

但是,使用此方法时出现编译错误TS2367,其中指出: This condition will always return 'false' since the types 'T[keyof O]' and 'S[keyof O]' have no overlap.

这个错误对我来说似乎违反直觉。如果两者TS类型的扩展对象O都没有,那么它们是否都必须都包含所有类型的键O如果有人能澄清我在这里想念的东西,以及对我要达到的目标有更合理的方法,我将不胜感激。

提香·切尔尼科娃·德拉戈米尔

您得到的错误并非不正确,扩展O只是意味着extends object,而这又意味着您可以使用T = { a: number }and O = { a: string }ex)。键是相同的,但T[keyof O]之间没有重叠O[keyof O]可能会有重叠,但是在处理TS时希望能够证明该函数对于type参数的任何有效实例都是正确的,并且正如我们在此处看到的,在某些情况下该函数无效。

您可能有几种方法来定义此函数,可以对第一个对象使用单个类型参数,然后将第二个对象定义为Pick或传入的属性。

function propsAreEqual<T extends object, K extends keyof T>(first: T, second: Pick<T, K>, props: K[]) {
    return props.every(prop => first[prop] === second[prop])
}

游乐场链接

此版本将确保两个参数的T [K]类型相同。此版本的缺点是,如果尝试将对象文字作为第二个参数传递,则会启动多余的属性检查。另一个缺点是,intellisense将T在第三个参数中建议所有属性,如果该属性不是常见的是,您会在第二个参数上看到错误。

就我个人而言,我更希望选择一个牺牲功能性的全类型检查作为回报,以解决上述两个问题。这将是此版本:

function propsAreEqual<T extends object,  S extends Pick<T, K>,  K extends keyof T & keyof S>(first: T, second: S, props: K[]) {
    return props.every(prop => first[prop] === (second as Pick<T, K>)[prop])
}

游乐场链接

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在打字稿中获取类的键

来自分类Dev

联合类型的部分键作为打字稿中对象的键

来自分类Dev

打字稿中的变量键作为对象成员

来自分类Dev

打字稿-在多维对象中查找匹配的键和路径

来自分类Dev

如何获取打字稿记录中的值的键

来自分类Dev

打字稿:使用日期作为Map中的键?

来自分类Dev

从打字稿中的值获取枚举的键

来自分类Dev

打字稿:接口键枚举

来自分类Dev

什么是打字稿中的打字?

来自分类Dev

打字稿中的打字破坏

来自分类Dev

打字稿array.map无法正确分配相交类型

来自分类Dev

在打字稿中选择一种相交类型

来自分类Dev

根据打字稿中的输入键,使用动态键从对象中选取值

来自分类Dev

已知键和未知键的打字稿打字

来自分类Dev

打字稿RequireJs快捷键+导航

来自分类Dev

打字稿遍历键入的对象键

来自分类Dev

打字稿:删除多个键循环数组

来自分类Dev

打字稿:有递归键吗?

来自分类Dev

打字稿模板文字作为接口键

来自分类Dev

打字稿RequireJs快捷键+导航

来自分类Dev

打字稿:枚举键作为函数的参数

来自分类Dev

打字稿:具有单个键的对象

来自分类Dev

从打字稿中的数组中的字符串派生键以定义对象属性名称

来自分类Dev

从打字稿中的对象列表中查找键的唯一值的有效方式

来自分类Dev

如何在未知密钥中通过 javascript 或打字稿中的键访问对象

来自分类Dev

打字稿中严格的打字别名

来自分类Dev

“ Duck”打字与打字稿中的函数参数

来自分类Dev

打字稿中的静态数组

来自分类Dev

打字稿中的专用接口