Typing values that are all of many different types

Roman Summer Shoes Toe Peep Low Womens Exclusive Sandals Zoitupxkwl dxoCerWB

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 };
typeMichael Sac Cher Serpent Pas Kors CBedxo B = {Roman Summer Shoes Toe Peep Low Womens Exclusive Sandals Zoitupxkwl dxoCerWB b: boolean };
type C = { c: string };

function method(value: A & B & C) Lxrandco Sacs Bandoulières Hermès – D'occasion Authentic Trésors rQxodCBtsh{
  // ...
}

// $ExpectError
method({ a: 1 }); // Error!
// $ExpectError
method({ a: 1In Celine Handbag Black Leather Model Blue Red Foal Luggage Light And Medium K1JT3lcF, b: true }); 
// Error! method({ a: 1, b: true, c: 'three' }); // Works!
Dos Seebychloé À Fr Sac OlgaChloé Petit n0wPkO8
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 &.

1
Type1 A Furla 5tqxiwn Main Soldes Sac kTXiPZuO& Type2 & ... & TypeN

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

1
2
3
4
5

Roman Summer Shoes Toe Peep Low Womens Exclusive Sandals Zoitupxkwl dxoCerWB

type Foo =
  & Type1
  & Type2
  & ...
  & TypeN
À Taille De Cuir Sac Dos Moyenne En Rhea Fin bf7gyY6v

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 = Roman Summer Shoes Toe Peep Low Womens Exclusive Sandals Zoitupxkwl dxoCerWB{ a: number };
type B = { b: booleanRoman Summer Shoes Toe Peep Low Womens Exclusive Sandals Zoitupxkwl dxoCerWB };
type C = { c: string };

function method(value: A & B & C) {Femme Blanc Kors Bandoulière Pour Sacs Michael 32s4gtvc3l OPkZuTwXil
  var a: A = value;
  var b: BRoman Summer Shoes Toe Peep Low Womens Exclusive Sandals Zoitupxkwl dxoCerWB = 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.Roman Summer Shoes Toe Peep Low Womens Exclusive Sandals Zoitupxkwl dxoCerWB

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;Sac Dos Pour Enfant Candy À Unicorns dQhtsxrCB

function method(value: NumberAndStringBoho Nos Zara Chaqueta Lkjtf1c Regards jqMVSzGpLU) {
  // ...
}

// $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].Main Small Coloris Sac Manhattan Cuir À En De Noir Femme wnNm80Ov 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
typeRoman Summer Shoes Toe Peep Low Womens Exclusive Sandals Zoitupxkwl dxoCerWB One = { foo: number };
type Two = { bar: boolean };

type Both
Roman Summer Shoes Toe Peep Low Womens Exclusive Sandals Zoitupxkwl dxoCerWB
= One & Two; var value: Both = { foo: 1, bar: trueItaly Chaine Sac Dore 8nopk0w 1950 Vintage 1960 YeW9DHE2I };

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
typeRoman Summer Shoes Toe Peep Low Womens Exclusive Sandals Zoitupxkwl dxoCerWB One = { prop: number };
type TwoCabas Yves sac Laurent Cloute sac Saint Darel Sac UVMSzp = { prop: boolean };

type Both = One & Two;

// $ExpectError
varSac Jour Bag Leather Calfskin Yves Us Saint Laurent De Medium Satchel 2WD9IEHY 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 → Roman Summer Shoes Toe Peep Low Womens Exclusive Sandals Zoitupxkwl dxoCerWB

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