2017-03-03 3 views
9
type someType = { 
    keyOne: string, 
    keyTwo: string, 
}; 

type someOtherType = { 
    keyOne: string, 
    keyTwo: string, 
    keyThree: string, 
}; 

Beide Arten sind Objekte, die keyOne und keyTwo, der einzige Unterschied ist, enthalten letztere erstreckt erstere mit einem zusätzlichen Schlüssel keyThree.Fluss: Erstellen eines Strömungstyp durch einen anderen Typ verlauf

Anstatt duplizierten Code zu schreiben, ist es möglich, den Fließtyp durch Erweitern von someType zu erstellen? In meinem Kopf ES6 Objekt Ruhe/Verbreitung in den Sinn kommt, aber ich bin mir nicht sicher, wie so etwas in Fluss zu erreichen.

Danke!

+1

Mögliche Duplikat [FlowType: Vererbung von Typen (Typ A ist eine Teilmenge des Typs B ...)] (http://stackoverflow.com/questions/42281539/flowtype-inheritance-of-types- Typ-a-is-a-Subset-of-Art-b) –

+0

Cool, danke für den Link. –

Antwort

10

Was Sie suchen ist die intersection type. Entsprechend der Dokumentation:

Ein Kreuzungstyp erfordert einen Wert für alle Eingabetypen.

Syntax: Überschneidung: < Typ 1> & < Typ 2> ... & < Typ n>

Der Kreuzungstyp soll eine bestehende Art erweitern und um sie zusätzliche Anforderungen Typ hinzuzufügen.

type someType = { 
    keyOne: string, 
    keyTwo: string 
} 

type someOtherType = someType & { 
    keyThree: string 
} 

const shouldBeOk: someOtherType = { 
    keyOne: 'biz', 
    keyTwo: 'buzz', 
    keyThree: 'baz', 
} 

const shouldError: someOtherType = { 
    keyOne: 123, 
    keyTwo: 'hello', 
    keyThree: 'world', 
} 

// flow error: 
16: const shouldError: someOtherType = { 
          ^object literal. This type is incompatible with 
8: type someOtherType = someType & { 
         ^object type 

Das logische Gegenteil des Kreuzungstypen ist die union type. Entsprechend der Dokumentation:

Ein Union-Typ erfordert, dass ein Wert einer der Eingabetypen ist.

Syntax: Union: < Typ 1> | < Typ 2> ... | < Typ n>

Als ein Beispiel. Sie können den Union-Typ verwenden, um einen Enumerable zu erstellen.

type fooBarBazType = 'foo' | 'bar' | 'baz'; 
const shouldBeOk: fooBarBazType = 'bar'; 

const shouldError: fooBarBazType = 'buzz'; 

4: const shouldError: fooBarBazType = 'buzz'; 
            ^string. This type is incompatible with 
4: const shouldError: fooBarBazType = 'buzz'; 
        ^string enum 
+1

die Antwort für das „mögliche Duplikat“ oben erwähnt ist Datum aus. Schnittstellentypen [wurden seit dem 1. Juli 2016 implementiert] (https://flowtype.org/blog/2016/07/01/New-Unions-Intersections.html). – thejohnbackes

+0

Es ist nicht veraltet. In meiner Antwort in diesem Link erwähne ich Kreuzungstypen. Sie funktionieren in den meisten Fällen. Sie können jedoch zu merkwürdigen Fehlermeldungen führen und funktionieren in manchen Fällen nicht wie erwartet (z. B. mit exakten Typen). Objekttyp Spread funktioniert besser für diesen Zweck und in der Tat ist es gestern gelandet: https://github.com/facebook/flow/commit/ad443dc92879ae21705d4c61b942ba2f8ad61e4d –

+0

Entschuldigung Nat, ich missverstanden. Ich dachte, Sie sagten, dass die Schnitttypen noch nicht veröffentlicht wurden. – thejohnbackes

Verwandte Themen