gpt4 book ai didi

typescript :对象键的联合和交集 "inverted"

转载 作者:行者123 更新时间:2023-12-03 09:26:37 25 4
gpt4 key购买 nike

根据我对集合论的了解,当您取两个集合的并集时,您会覆盖两个集合并取结果集。当你取两个集合的交集时,你将两个集合重叠并取彼此重叠的部分。
对于数字,这很好用:

type SomeUnion = (1 | 2 | 3) | (2 | 3 | 4)
const someUnion: SomeUnion // typeof someUnion is 1 | 2 | 3 | 4

type SomeIntersect = (1 | 2 | 3) & (2 | 3 | 4)
const someIntersect: SomeIntersect // typeof someIntersect is 2 | 3
对于对象键,在我看来,交集和联合操作的工作非常不直观。
type ObjUnion = { one: string, two: string } | { two: string, three: string }
const objUnionKeys: keyof ObjUnion // typeof objUnionKeys is 'two' while I would expect it to be all keys -> 'one' | 'two' | 'three'

type ObjIntersection = { one: string, two: string } & { two: string, three: string }
const objIntersectionKeys: keyof ObjIntersection // typeof objIntersectionKeys is 'one' | 'two' | 'three' while I would expect it only to be the keys in common -> 'one'
我想它为什么像这样工作有充分的理由。有人可以填写我吗?

最佳答案

你是对的,对象联合和交集的行为似乎与文字的行为完全相反,但它实际上完全有道理:) 让我们深入研究为什么!
如果您有字符串或数字文字的联合类型 à la

type SomeUnion = 1 | 2 | 3 | 2 | 3 | 4
你说的是 SomeUnion可以是这些数字中的任何一个。
当你有
type SomeIntersect = (1 | 2 | 3) & (2 | 3 | 4)
你说的是 SomeIntersect必须满足两个群体的约束。在这种情况下,唯一满足两者的数字是 2 和 3,因此上面的等价于 type SomeIntersect = 2 | 3
尽管对象的联合和交集的语义是不同的。
当你有
type ObjUnion = { one: string, two: string } | { two: string, three: string }
你说的是 ObjUnion可以有任何一种形状 - 这意味着您确定的唯一字段存在于 ObjUnion 上。是 "two" .其他的可能存在也可能不存在,这取决于它实际上是两种形状中的哪一种。但你确实确定 { two: string }存在于对象上。

到那个时刻
type ObjIntersection = { one: string, two: string } & { two: string, three: string }
你说的是 ObjIntersection必须在两种对象类型中具有所有 3 个字段,否则它将不满足交集的约束。
这意味着如果您有一个类型为 ObjIntersection 的对象您知道它具有所有 3 个字段,因此 TypeScript 可以让您毫无问题地访问其中任何一个!

关于 typescript :对象键的联合和交集 "inverted",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63674001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com