set - Benennung von TypeScript-Unionen- und Schnittmengentypen
Ich kann die Logik hinter den Begriffen Intersection Types und Union Types in TypeScript nicht verstehen. Ich denke an Schnittstellen (oder Klassen) als Mengen von Eigenschaften.
Der logische Konjunktionsoperator & entspricht der Schnittmenge in der Mengenlehre, definiert als:
Der Schnittpunkt zweier Mengen A und B ist die Menge, die alle Elemente von A enthält, die auch zu B gehören
In TypeScript wird ein Schnittmengentyp ebenfalls mit dem &-Operator erstellt und wie folgt definiert:
Der Schnittpunkttyp des Interface
Colorfulund des InterfaceCircleist ein neuer Typ, der alle Mitglieder vonColorfulundCirclehat
Das ist das genaue Gegenteil davon, wie Schnitt in der Mathematik und Mengenlehre definiert ist.
Ich bin sicher, dass es eine andere Möglichkeit gibt, es zu betrachten, aber ich kann sie nicht herausfinden.
Antwort #1
Hier ist eine weitere Möglichkeit, darüber nachzudenken. Betrachten Sie vier Mengen: blaue Dinge, rote Dinge, große Dinge und kleine Dinge.
Wenn Sie die Menge aller blauen Dinge und aller kleinen Dinge schneiden, erhalten Sie die Vereinigung der Eigenschaften - alles in der Menge hat sowohl die blaue Eigenschaft als auch die kleine Eigenschaft.
Aber wenn man die Vereinigung von blauen kleinen Dingen und roten kleinen Dingen bildet, ist nur die Eigenschaft der Kleinheit in der resultierenden Menge universell. Das Schneiden von "blau klein" mit "rot klein" ergibt "klein".
Mit anderen Worten, die Vereinigungsbildung der Wertebereiche erzeugt eine Schnittmenge von Eigenschaften und umgekehrt.
In Bildform:
Antwort #2
Der Typ A | B bezieht sich auf Objekte, die entweder A oder B sind. Mit anderen Worten, Werte dieses Typs werden aus der Vereinigung von Werten für A und Werten für B genommen.
Der Typ A & B bezieht sich auf Objekte, die sowohl A als auch B sind. Mit anderen Worten stammen Werte dieses Typs aus der Durchschnittsmenge der Werte von A und der Werte von B.
Die Benennung und Semantik sind in anderen Sprachen wie C++ identisch.
Antwort #3
In diesem Fall dürfen Sie nicht an Typen als Mengen von Objekteigenschaften denken. Wir können die Verwirrung darüber, wie Union- und Schnittmengentypen funktionieren, vermeiden, indem wir uns skalare Variablen und ihre Mengen zulässiger Werte ansehen (anstatt Objekte):
type A = 1 | 2
type B = 2 | 3
type I = A & B
type U = A | B
let a: A
let b: B
let i: I
let u: U
a = 1
a = 2
a = 3 // <- error
b = 1 // <- error
b = 2
b = 3
i = 1 // <- error
i = 2
i = 3 // <- error
u = 1
u = 2
u = 3
Hier entsprechen die Begriffe „Vereinigung“ und „Schnittmenge“ genau den Begriffen der Mengenlehre, wenn sie auf die Mengen zulässiger Werte angewendet werden.
Die Anwendung des Begriffs der zulässigen Werte (Instanzen) auf Objekttypen ist etwas kniffliger (weil die Mengenlehre-Analogie nicht gut zutrifft):
type A = {
x: number
y: number
}
type B = {
y: number
z: number
}
type I = A & B
type U = A | B
- Eine Variable vom Typ
Akann Objektinstanzen mit den Eigenschaftenxundy(und keinen anderen Eigenschaften) halten. - Eine Variable vom Typ
Bkann Objektinstanzen mit den Eigenschaftenyundz(und keinen anderen Eigenschaften) enthalten. - In der Mengenlehre ist die Schnittmenge der beiden oben genannten Mengen von Objektinstanzen leer. Ein Variablen eines Schnittmengentyps
Ikann jedoch Objekte mit den Eigenschaften des TypsAUND des TypsBenthalten (d.h.x,yundz; daher das&-Symbol), was der Vereinigung der Eigenschaften der beiden Typen entspricht (daher die Verwirrung). - In der Mengenlehre umfasst die Vereinigung der beiden oben genannten Mengen von Objektinstanzen keine Objekte mit allen drei Eigenschaften. Eine Variable vom Vereinigungstyp
Ukann jedoch Objekte mit den Eigenschaften des TypsAODER denen des TypsBenthalten (logisches ODER, nicht XOR, das heißtxundy,yundzoderx,yundz; daher das|-Symbol), was impliziert, dass die Schnittmenge der Eigenschaften der beiden Typen (yin unserem Beispiel) garantiert vorhanden ist (daher die Verwirrung).
let i: I
let u: U
i = { x: 1, y: 2 }; // <- error
i = { y: 2, z: 3 }; // <- error
i = { x: 1, y: 2, z: 3 };
u = { x: 1, y: 2 };
u = { y: 2, z: 3 };
u = { x: 1, y: 2, z: 3 };
Antwort #4
Die Verwirrung hier rührt wahrscheinlich daher, wie wir die Mengen vorstellen, nämlich indem wir die Schnittmenge/Vereinigung als die Mitglieder der Typen betreffend betrachten, anstatt die Typen selbst. Ich habe eine Grafik zusammengestellt, die hoffentlich das Konzept verdeutlicht:

