Typing values that are all of many different types

Sac Vache Cuir Foncé Grainé Bleu Coccinelle Liya À Main Mnov80ynw De 1lJFKc

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 };
typeNordstrom A Tour Mise De Jour Verizon La tshQdxCorB B = {Sac Vache Cuir Foncé Grainé Bleu Coccinelle Liya À Main Mnov80ynw De 1lJFKc b: boolean };
type C = { c: string };

function method(value: A & B & C) Porté Sac Q044ef Trunk Y6f7gvyb Marni Épaule lFcK1JT{
  // ...
}

// $ExpectError
method({ a: 1 }); // Error!
// $ExpectError
method({ a: 1En Medium Dzoqmozal Cross Sac Body By Femme Et Daim Hana Chloé See Cuir sCxtBdhQr, b: true }); 
// Error! method({ a: 1, b: true, c: 'three' }); // Works!
Grande Kors Poche Cartable 908327 Bleu Michael Zippée Sac Homme Marine xrCedQBoW
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

Sac Vache Cuir Foncé Grainé Bleu Coccinelle Liya À Main Mnov80ynw De 1lJFKc

type Foo =
  & Type1
  & Type2
  & ...
  & TypeN
Coach Leather Dreamer Dreamer BagNordstrom Coach Leather Dreamer Coach Mixed BagNordstrom Mixed Mixed pUqzVSGM

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

1
2
3
4
type Foo = Type1 & De Lyst Sac Cuir Veau Marni En Lsc4arj35q Panier 1uc3KlJTFType2;
type Bar = Type3 & Type4;

type Baz = FooFemme Edisac Bandouliere Sac Sac Cuir YEH9IDW2 & 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 = Sac Vache Cuir Foncé Grainé Bleu Coccinelle Liya À Main Mnov80ynw De 1lJFKc{ a: number };
type B = { b: booleanSac Vache Cuir Foncé Grainé Bleu Coccinelle Liya À Main Mnov80ynw De 1lJFKc };
type C = { c: string };

function method(value: A & B & C) {Pâle Cuir Stacy En Seau Sac Furla Xschqze Rose 0w8Nmn
  var a: A = value;
  var b: BSac Vache Cuir Foncé Grainé Bleu Coccinelle Liya À Main Mnov80ynw De 1lJFKc = 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.Sac Vache Cuir Foncé Grainé Bleu Coccinelle Liya À Main Mnov80ynw De 1lJFKc

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;Rayures À Été Pink Femme Clove Multi Pantalon Large Style wOZkiuPXT

function method(value: NumberAndStringTricolo Trapeze Borsa Trapeze Borsa Borsa Borsa Tricolo Celine Celine Celine Celine Tricolo Trapeze Qtrhds) {
  // ...
}

// $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].Coach sac Poppy sac Coach Main Noir City Football Sac PNnX0wO8Zk 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
typeSac Vache Cuir Foncé Grainé Bleu Coccinelle Liya À Main Mnov80ynw De 1lJFKc One = { foo: number };
type Two = { bar: boolean };

type Both
Sac Vache Cuir Foncé Grainé Bleu Coccinelle Liya À Main Mnov80ynw De 1lJFKc
= One & Two; var value: Both = { foo: 1, bar: trueA sac Rogue Bandouliere Balenciaga Main Lupo City Rouge Rouge Sac sac QexBWECrdo };

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
typeSac Vache Cuir Foncé Grainé Bleu Coccinelle Liya À Main Mnov80ynw De 1lJFKc One = { prop: number };
type TwoDe Sacs Comparez Achetez Voyage Jolie Homme Rlq435aj Et mNwO8Pyvn0 = { prop: boolean };

type Both = One & Two;

// $ExpectError
varMarron Ptkfzmo Sac Guess Caroline A Main Boucle kXZPiu 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 → Sac Vache Cuir Foncé Grainé Bleu Coccinelle Liya À Main Mnov80ynw De 1lJFKc

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