TypeScript手册问题?

时间:2018-02-05 13:06:57

标签: typescript

我正在阅读TypeScript手册的Advanced Type section 在我看来,交集类型和联合类型的描述是互换的:

  

交叉点类型

     

交集类型将多种类型合并为一个[...]

这就是我期望的联合类型:

  

联盟类型

     

如果我们有一个具有联合类型的值,我们只能访问联合中所有类型共有的成员。

所有成员共同听起来像一个交集。

这看起来是否正确?

2 个答案:

答案 0 :(得分:0)

在结构类型系统中,type可以定义为符合该类型的所有值的集合。例如,如果你有

type A = {a: string}

然后符合A的值集是一组具有名为a的属性且属性类型为string的所有对象。

如果你有

type B = {b: number}

然后

type AB = A & B

您刚才描述的AB是一组具有正确类型的属性ab的所有对象,换句话说,就是集合AB。所以碰巧交叉类型的对象类型必须具有来自两种类型的所有属性,并且它的属性集是一个联合 - 这就是混乱的来源。

如果将类型定义为属性集合,那么确实会切换union和intersection的定义,但这种定义更有限 - 它不允许为所有类型定义交集和并集。有些类型不是对象(例如,undefined),有些类型的属性也不能被描述为对象的属性 - 例如,函数类型的对象是可调用的。

答案 1 :(得分:0)

术语不是特定于TypeScript的。仍然令人困惑!

这两种类型是互补的:

  

“交集类型[是]联合类型的逻辑补充。联合类型A | B表示类型为A或类型为B的实体,而交集类型为{{ 1}}表示同时具有A & B类型和A类型的实体。“, Anders Hejlsberg's pull request

确实,考虑以​​下类型:

B

他们可以这样看:

  • interface A {} interface B extends A { } interface C extends A { } interface D extends B, C { }
  • A == B | C | D

但他们没有相同的共同用法。

联盟类型

  

“联合类型定义将指定可以在其实例中存储多个允许的基元类型”, Wikipedia

常见用例:

  • “Nullable”:D == B & C,加上T | null compiler option
  • 原始值列表:strictNullChecks(而不是'A' | 'B' | 'C'
    • Redux操作名称
    • string
    • 的输出
    • ...

交叉点类型

不要与mathematical set intersection混淆。

  

“[在结构子类型中],两种类型的结构决定一个是否是另一个”, Wikipedia 的子类型。

交叉点类型在日常代码中并不常见: