当前位置: 首页 > 知识库问答 >
问题:

交集和合并类型“{ foo }”之间的区别

骆利
2023-03-14

考虑定义如下的 FooBar1 和 FooBar2 类型:

type Foo = { foo: string };
type Bar = { bar: number };
type FooBar1 = Foo & Bar;
type FooBar2 = { foo: string; bar: number };

我的尝试/研究:

  • 它们是双向相互分配的!(手动检查并使用TSD检查 - 请参阅此处)
  • 不过,它们彼此并不完全相同!(与TSD检查 - 见这里)
  • VSCode 的智能感知不会崩溃 { foo }
// |------------------------------------------------------------|
// | let x: {                                                   |
// |     a: string;                                             |
// | } & {                                                      |
// |     b: string;                                             |
// | }                                                          |
// | -----------------------------------------------------------|
//  ^
//  | When hovering `x` here:
//  |
let x: { a: string } & { b: string };

编辑:TypeScript中扩展和交叉接口之间的区别?已被建议为重复,但我不同意。我不是在将交集与接口的扩展进行比较,而是将交集与另一种原始类型进行比较,不涉及接口或扩展。


共有1个答案

常雪风
2023-03-14
匿名用户

在您的示例中,我们可以说< code>FooBar1和< code>FooBar2相等。而且我们确实可以证明:

type Equals<A, B> =
    A extends B
    ? B extends A
      ? true
      : false
    : false

type test0 = Equals<{a: 1} & {b: 2}, {a: 1, b: 2}> // true

但是对于一个笼统的回答,我们只能说,它们并不总是相等的。为什么?因为在某些情况下,交集可以解析为< code>never。如果ts发现一个交集是有效的,它继续进行,否则返回< code>never。

import {O} from "ts-toolbelt"

type O1 = {a: 1, b: 2}
type O2 = {a: 1} & {b: 2}       // intersects properly
type O3 = {a: 1, b: 2} & {b: 3} // resolved to `never`

type test0 = Equals<O1, O2>
// true

type test1 = O.Merge<{a: 1, b: 2}, {b: 3, c: 4}>
// {a: 1, b: 2, c: 4}

这里类型 O3 解析为从不,因为 b3,它不能与 2 重叠。让我们更改我们的示例,以证明如果您有以下情况,交叉点将起作用:

import {A} from "ts-toolbelt"

type O4 = A.Compute<{a: 1, b: number} & {b: 2}> // {a: 1, b: 2}
type O5 = A.Compute<{a: 1, b: 2} & {b: number}> // {a: 1, b: 2}

这个例子还强调了交集的工作原理——就像并集交集一样。TypeScript 将遍历所有属性类型并将它们相交。我们强制 TypeScript 计算与 A.Compute 交集的结果。

简而言之,如果 ts 不能重叠所有成员,那么该交集的乘积永远不会。因此,它可能不适合作为合并工具:

type O3 = {a: 1, b: 2} & {b: 3} // resolved to `never`

所以请记住,<代码>

 类似资料:
  • 问题内容: 在Java中,这两个函数声明之间有什么区别? 在这里,您可以找到该问题的答案,但仅适用于 C / C ++ 。在这些语言中,两种声明样式的存在是完全有意义的。 但是在 Java 中这有什么意义呢? 问题答案: 后者在Java中是非法的。您不能声明这样的方法。您应该得到这样的错误: 因此,不仅没有意义-您根本找不到尝试使用此样式的有效代码。

  • 我可以通过以下方法将数据发送到Firebase FiRecovery文档: 1) 添加() 2) set() 我很清楚,如何将数据添加到Firestore中,其中没有任何混淆。但我的问题是,Firebase Firestore中的方法“set”有两个setOption,例如merge和mergefields。这两组选项之间的区别是什么,我认为这两个选项的作用是相同的。如何实现setOption“m

  • 问题内容: 请考虑以下两个函数定义: 两者之间有什么区别吗?如果没有,那为什么会有void争论呢?审美原因? 问题答案: 在C中: 表示“带有未指定类型的未指定数量的参数的函数” 表示不带参数的函数” 在C ++中: 表示“foo不带参数的函数” 表示“foo不带参数的函数” 因此,通过编写,我们可以在两种语言中实现相同的解释,并使标头变为多语言(尽管我们通常需要对标头做更多的事情才能使它们真正成

  • 本文向大家介绍Java中传统集合与并行集合之间的区别,包括了Java中传统集合与并行集合之间的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,在Java中,集合是最重要的概念之一,它使Java本身成为一种强大的语言。它仅支持Java中的集合,这使得它可以方便,有效地支持任何类型的数据以及可能对它们进行的CRUD操作。 但是在同一阶段,当集合暴露于多线程环境时,由于某些地方集合缺乏对多线程环

  • 本文向大家介绍Java中的集合与集合之间的区别,包括了Java中的集合与集合之间的区别的使用技巧和注意事项,需要的朋友参考一下 Java收集框架用于操纵对象的收集。收集框架包含多个包装器类,便利类,用于传统实现的类,例如vector和Hashtable,收集接口等。     集合是Java集合框架中的接口。它分为两部分- Java util集合-它包含诸如Set,queue,List等的类。 Ja

  • 本文向大家介绍Java中列表和集合之间的区别,包括了Java中列表和集合之间的区别的使用技巧和注意事项,需要的朋友参考一下 List和Set这两个接口都属于Collection框架。这两个接口都扩展了Collection接口。它们都用于将对象集合存储为单个单元。  在jdk1.2之前,我们曾经使用Arrays,Vectors和Hashtable将对象分组为一个单元。  序号 键 列表 组 1个 位