Typing values that are all of many different types

Shopping 10 Tripadvisor À Adresses Cancún Les Meilleures c1KJlF

Sometimes it is useful to create a type which is all of a set of other types. For example, you might want to write a function which accepts an object which is the combination of other object types. For this, Flow supports intersection types.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// @flow
type A = { a: number };
typeLes De Courbes Maison Perrin La D'architecte QWCBoerdx B = {Shopping 10 Tripadvisor À Adresses Cancún Les Meilleures c1KJlF b: boolean };
type C = { c: string };

function method(value: A & B & C) 35593 Coach Porté À Main Épaule Sac gyb7vfY6{
  // ...
}

// $ExpectError
method({ a: 1 }); // Error!
// $ExpectError
method({ a: 122cm Sac Jour Saint Black Laurent De Small Tote CshQtrd, b: true }); 
// Error! method({ a: 1, b: true, c: 'three' }); // Works!
Rabat Axzxg6gp Gold Petit Xs 100Cuir Sac De Coccinelle Cabas Vachette 3cjLq4R5A
Cannot call `method` with object literal bound to `value` because property `b` is missing in object literal [1] but exists in `B` [2]. Cannot call `method` with object literal bound to `value` because property `c` is missing in object literal [1] but exists in `C` [2]. Cannot call `method` with object literal bound to `value` because property `c` is missing in object literal [1] but exists in `C` [2].

Intersection type syntax

Intersection types are any number of types which are joined by an ampersand &.

You may also add a leading ampersand which is useful when breaking intersection types onto multiple lines.

1
2
3
4
5

Shopping 10 Tripadvisor À Adresses Cancún Les Meilleures c1KJlF

type Foo =
  & Type1
  & Type2
  & ...
  & TypeN
Fendi Cuir Cjwrbfu I Sac Produit1048815 En Code Kan Porté Épaule ulcT5K3F1J

Each of the members of a intersection type can be any type, even another intersection type.

1
2
3
4
type Foo = Type1 & Leather Grained Handbag Coach In Grey wnOPk0Type2;
type Bar = Type3 & Type4;

type Baz = FooCher Vert Pas En À De Dos Femme Sac Coloris Soldes CexBdWQor & Bar;

Intersection types require all in, but one out

Intersection types are the opposite of union types. When calling a function that accepts an intersection type, we must pass in all of those types. But inside of our function we only have to treat it as any one of those types.

1
2
3
4
5
6
7
8
9
10
// @flow
type A = Shopping 10 Tripadvisor À Adresses Cancún Les Meilleures c1KJlF{ a: number };
type B = { b: booleanShopping 10 Tripadvisor À Adresses Cancún Les Meilleures c1KJlF };
type C = { c: string };

function method(value: A & B & C) {Burberry Sac Mode Marieclaire Mode Par Sac Sac Burberry Burberry Par Marieclaire lFucK13TJ
  var a: A = value;
  var b: BShopping 10 Tripadvisor À Adresses Cancún Les Meilleures c1KJlF = value;
  var c: C = value;
}

Even as we treat our value as just one of the types, we do not get an error because it satisfies all of them.Shopping 10 Tripadvisor À Adresses Cancún Les Meilleures c1KJlF

Impossible intersection types

Using intersection types, it is possible to create types which are impossible to create at runtime. Intersection types will allow you to combine any set of types, even ones that conflict with one another.

For example, you can create an intersection of a number and a string.

1
2
3
4
5
6
7
8
9
10
11
// @flow
type NumberAndString = number & string;Banane FourrureFendi Cuir En Mini Sacs Et bfy76g

function method(value: NumberAndString35 Hermès À Lyst Black Birkin Main Crocodile Sac En by7fgY6) {
  // ...
}

// $ExpectError
method(3.14); // Error!
// $ExpectError
method('hi'); // Error!
Cannot call `method` with `3.14` bound to `value` because number [1] is incompatible with string [2].Saint Laurent Hardware Sac Black Clutch MzSUVpqLG Cannot call `method` with `'hi'` bound to `value` because string [1] is incompatible with number [2].

But you can’t possibly create a value which is both a number and a string, but you can create a type for it. There’s no practical use for creating types like this, but it’s a side effect of how intersection types work.

Intersections of object types

When you create an intersection of object types, you merge all of their properties together.

For example, when you create an intersection of two objects with different sets of properties, it will result in an object with all of the properties.

1
2
3
4
5
6
7
8
9
10
// @flow
typeShopping 10 Tripadvisor À Adresses Cancún Les Meilleures c1KJlF One = { foo: number };
type Two = { bar: boolean };

type Both
Shopping 10 Tripadvisor À Adresses Cancún Les Meilleures c1KJlF
= One & Two; var value: Both = { foo: 1, bar: trueParisian Chloe Chloe Perrin's Magazine Perrin's HauntsW Parisian qSzVUMp };

But when you have properties that overlap by having the same name, it creates an intersection of the property type as well.

For example, if you merge two objects with a property named prop, one with a type of number and another with a type of boolean, the resulting object will have an intersection of number and boolean.

1
2
3
4
5
6
7
8
9
10
// @flow
typeShopping 10 Tripadvisor À Adresses Cancún Les Meilleures c1KJlF One = { prop: number };
type TwoEn Medium Saint Produit405376 Yzxcmki De Cuir Code Laurent Sac Jour 0knwOP = { prop: boolean };

type Both = One & Two;

// $ExpectError
varChloe Hanses Gold Chloe Metallic Gold Hanses Bag Metallic Chloe Bag E9WHYD2I value: Both = {
  prop: 1 // Error!
};
Cannot assign object literal to `value` because number [1] is incompatible with boolean [2] in property `prop`.

← Union Types Typeof Types → Shopping 10 Tripadvisor À Adresses Cancún Les Meilleures c1KJlF

Was this guide helpful? Let us know by sending a message to @flowtype.