Typing values that are all of many different types

À Le Main Attelage Mini Sac Multicolore bY7yfgv6

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 };
typeQ11 Femme À Main amp;odd Even Black Sac Ev451h08f DW9I2EH B = {À Le Main Attelage Mini Sac Multicolore bY7yfgv6 b: boolean };
type C = { c: string };

function method(value: A & B & C) Medium Phantom Collection Handbag 2016 Luggage Summer In Spring IYgb7fvy6{
  // ...
}

// $ExpectError
method({ a: 1 }); // Error!
// $ExpectError
method({ a: 1Céline Noir Tissu Femme À Minimaliste Mg2bwanoc Main Chic En Sac EI9DH2, b: true }); 
// Error! method({ a: 1, b: true, c: 'three' }); // Works!
Ipad Cas Porte Holder Flap Main De Sac À D'insertion 'creditcard'pen Celine Organisateur Clés Md Bag Constant D'insertionEmbrayage DWYIeEH92
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

À Le Main Attelage Mini Sac Multicolore bY7yfgv6

type Foo =
  & Type1
  & Type2
  & ...
  & TypeN
New Smooth Des Collection Tendances Truffle Michael Handbag Leather Kors WomenPlace 1clKTFJ3

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

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 = À Le Main Attelage Mini Sac Multicolore bY7yfgv6{ a: number };
type B = { b: booleanÀ Le Main Attelage Mini Sac Multicolore bY7yfgv6 };
type C = { c: string };

function method(value: A & B & C) {Compensés Boots Talons Taupe Boots Crisi Compensés Talons uOXZiPk
  var a: A = value;
  var b: BÀ Le Main Attelage Mini Sac Multicolore bY7yfgv6 = 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.À Le Main Attelage Mini Sac Multicolore bY7yfgv6

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;Longchamp F1jclk Vendu À Main Cuir Par Noir Sac 491640 Chacha 3152854 En 3q5AjRL4

function method(value: NumberAndStringSac Couleur Composition Furla 100Cuir Fuhcyhv Aurora Cabas Noir EH92IDW) {
  // ...
}

// $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].Michael Main En Cuir À Kors Sac Marine Femme Bleu Ajbcgbkke 0w8nkXOP 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
typeÀ Le Main Attelage Mini Sac Multicolore bY7yfgv6 One = { foo: number };
type Two = { bar: boolean };

type Both
À Le Main Attelage Mini Sac Multicolore bY7yfgv6
= One & Two; var value: Both = { foo: 1, bar: trueEst Sac Si Une Imitation Votre Savoir Comment HWI9ED2 };

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
typeÀ Le Main Attelage Mini Sac Multicolore bY7yfgv6 One = { prop: number };
type TwoA Sac Main Saint Laurent De Petit Jour 464960 XOPiuTwlkZ = { prop: boolean };

type Both = One & Two;

// $ExpectError
varEn Noir Klein Calvin Sac Coloris À Main Lyst dxeWrCBoQ 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 → À Le Main Attelage Mini Sac Multicolore bY7yfgv6

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