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

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

oba typy są przedmioty, które zawierają keyOne i keyTwo, jedyną różnicą jest to ostatni rozciąga tej pierwszej w dodatkowy klucz keyThree.przepływu: Tworzenie typu przepływu przez rozszerzenie inny rodzaj

Zamiast pisać powielony kod, można zbudować typ przepływu someOtherType przez rozszerzenie someType? W moim umyśle przychodzi mi na myśl spoczynkowy obiekt ES6, ale nie jestem pewien, jak osiągnąć coś takiego w Flow.

Dzięki!

+1

Możliwy duplikat [FlowType: Dziedziczenie Types (Typ A jest podzbiorem typu B ...)] (http://stackoverflow.com/questions/42281539/flowtype-inheritance-of-types- type-a-is-a-subset-of-type-b) –

+0

Fajnie, dziękuję za link. –

Odpowiedz

10

To, czego szukasz, to intersection type. Zgodnie z dokumentacją:

Typ przecięcia wymaga podania wartości wszystkich typów danych wejściowych.

składni: przecięcie: < typu 1> & < typu 2> ... & < typu n>

typ skrzyżowania jest rozszerzenie istniejącego typu i dodatkowe wymagania typu do niego.

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 

Logicznym przeciwieństwem typu przecięcia jest union type. Zgodnie z dokumentacją:

Typ unii wymaga, aby wartość była jednym z typów danych wejściowych.

Składnia: Union: < typ 1> | < typ 2> ... | < typ n>

Jako przykład. możesz użyć typu unii, aby utworzyć przelicznik.

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

Odpowiedź na "możliwy duplikat", który podano powyżej, jest nieaktualna. Typy skrzyżowań [wdrożono od 1 lipca 2016 r.] (Https://flowtype.org/blog/2016/07/01/New-Unions-Intersections.html). – thejohnbackes

+0

Nie jest nieaktualny. W mojej odpowiedzi w tym linku wymieniam rodzaje skrzyżowań. W większości przypadków działają. Mogą jednak prowadzić do dziwnych komunikatów o błędach i nie działają zgodnie z oczekiwaniami w niektórych przypadkach (np. Z dokładnymi typami). Rozprzestrzenianie typu obiektów będzie działało lepiej w tym celu, aw rzeczywistości wylądowało to wczoraj: https://github.com/facebook/flow/commit/ad443dc92879ae21705d4c61b942ba2f8ad61e4d –

+0

Przepraszam Nat, źle mnie zrozumiałem. Myślałem, że mówisz, że typy skrzyżowań nie zostały jeszcze wydane. – thejohnbackes