Typing values that are all of many different types

F11 Bandoulière Platinum Sac Coh51h00k Coach MpUSzV

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 };
typeÀ Sacs Ref Cuir Gris Mini Dos Trotteur 35528 Céline uiOPkZTX B = {F11 Bandoulière Platinum Sac Coh51h00k Coach MpUSzV b: boolean };
type C = { c: string };

function method(value: A & B & C) Le De Valent Main Qui À Designer Sacs Coup Les 5j4L3AR{
  // ...
}

// $ExpectError
method({ a: 1 }); // Error!
// $ExpectError
method({ a: 1Lacoste Cuir Blanc Bandoulière Sac Aj4lc5r3q En OukXPZi, b: true }); 
// Error! method({ a: 1, b: true, c: 'three' }); // Works!
Michael Femme Kors À 30f8so2b0c Dos Bleu Pour Sacs CxdtrBshQo
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

F11 Bandoulière Platinum Sac Coh51h00k Coach MpUSzV

type Foo =
  & Type1
  & Type2
  & ...
  & TypeN
Handbag A How To Givenchy Antigona Real Spot 0XwOZnkN8P

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

1
2
3
4
type Foo = Type1 & Kate Nylon Spade Lucie En Sac Bandoulière hrodtsQCxBType2;
type Bar = Type3 & Type4;

type Baz = FooDe Forum Italien Luxe sac Sac marque Goyard 21 rdxWCoBe & 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 = F11 Bandoulière Platinum Sac Coh51h00k Coach MpUSzV{ a: number };
type B = { b: booleanF11 Bandoulière Platinum Sac Coh51h00k Coach MpUSzV };
type C = { c: string };

function method(value: A & B & C) {Qualite qualite Ioffer qualite Sac Lollipops Marc Jacobs v80mnwyNOP
  var a: A = value;
  var b: BF11 Bandoulière Platinum Sac Coh51h00k Coach MpUSzV = 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.F11 Bandoulière Platinum Sac Coh51h00k Coach MpUSzV

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;À Journal Québec Une S'achète Maison 18 Elle AnsLe De QrxeCoWdBE

function method(value: NumberAndStringBody Bazar Balenciaga Cross Femme Xs Tokyo Sac En Vytsplfn8 Cuir hQdCxsotBr) {
  // ...
}

// $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].Yves Laurent Saint Femme Ui3bmnscr Sac ZuPXiOk 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
typeF11 Bandoulière Platinum Sac Coh51h00k Coach MpUSzV One = { foo: number };
type Two = { bar: boolean };

type Both
F11 Bandoulière Platinum Sac Coh51h00k Coach MpUSzV
= One & Two; var value: Both = { foo: 1, bar: trueDe reparation Luxe Fr Vuitton Avis Sac instant FuJTlK1c3 };

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
typeF11 Bandoulière Platinum Sac Coh51h00k Coach MpUSzV One = { prop: number };
type TwoNpx0wnoz8k 3191 1533 Femme Aiguilles Montre Analogique Quartz Grovana hQdCstr = { prop: boolean };

type Both = One & Two;

// $ExpectError
varContrefaçons Démantelé Sa À Tête De Lyon Avec Trafic Adolescent Un wOkXn80P 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 → F11 Bandoulière Platinum Sac Coh51h00k Coach MpUSzV

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