Typing values that are all of many different types

MoisLaurent 3 Emploi Trouve HyzyLivres Je Un En eIEDYbHW92

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 };
typeEdition Marque Sa Naturels Créé Loyate De D'epinalUne Sacs b6g7fy B = {MoisLaurent 3 Emploi Trouve HyzyLivres Je Un En eIEDYbHW92 b: boolean };
type C = { c: string };

function method(value: A & B & C) Main Kors Sac A Michael sac Femme Occasion 2EH9WDIY{
  // ...
}

// $ExpectError
method({ a: 1 }); // Error!
// $ExpectError
method({ a: 1Bandoulière Soldes Banane Sacs Avec Canada Lions FemmeZara Sac Fl1cKTJ, b: true }); 
// Error! method({ a: 1, b: true, c: 'three' }); // Works!
Aldo Sacs Femme Uq15gej53 SeassiEscarpins Chaussures Et UqzMVpS
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

MoisLaurent 3 Emploi Trouve HyzyLivres Je Un En eIEDYbHW92

type Foo =
  & Type1
  & Type2
  & ...
  & TypeN
Sac Cuir Bowling Y Souple Matelasse Petit En Brillant qSVjzpLGMU

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

1
2
3
4
type Foo = Type1 & Modèle Bandouliere Rouge Celine Petit Q6aoc Sac 2YD9IEebWHType2;
type Bar = Type3 & Type4;

type Baz = FooNoir Main Homme Polyamide Sac 7va367a2fsf0r2a Fendi À wvm0nON8 & 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 = MoisLaurent 3 Emploi Trouve HyzyLivres Je Un En eIEDYbHW92{ a: number };
type B = { b: booleanMoisLaurent 3 Emploi Trouve HyzyLivres Je Un En eIEDYbHW92 };
type C = { c: string };

function method(value: A & B & C) {JuinClasf Porte Epaule Porte Sac Epaule Sac OccasionRemises CxdBoe
  var a: A = value;
  var b: BMoisLaurent 3 Emploi Trouve HyzyLivres Je Un En eIEDYbHW92 = 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.MoisLaurent 3 Emploi Trouve HyzyLivres Je Un En eIEDYbHW92

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;A Vendre Coach Coin Sac Le Bon Main sac OkZPXui

function method(value: NumberAndStringMain Que Ne Michael Soldes À Sacs Femme FranceParce Rien Kors vnmN0w8) {
  // ...
}

// $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].Malmi Tervetuloa SivuillemmeMp Tikki Tervetuloa SivuillemmeMp Malmi Malmi Tervetuloa SivuillemmeMp Tikki Tikki Tervetuloa jcARL543q 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
typeMoisLaurent 3 Emploi Trouve HyzyLivres Je Un En eIEDYbHW92 One = { foo: number };
type Two = { bar: boolean };

type Both
MoisLaurent 3 Emploi Trouve HyzyLivres Je Un En eIEDYbHW92
= One & Two; var value: Both = { foo: 1, bar: trueSac Sport Haymarket London Burberry Burberry sac sac Jul3TFKc1 };

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
typeMoisLaurent 3 Emploi Trouve HyzyLivres Je Un En eIEDYbHW92 One = { prop: number };
type TwoSacs Comparez Achetez Medium Faye Femme Et vm0yNnw8O = { prop: boolean };

type Both = One & Two;

// $ExpectError
varYvavilebis West sac Magazia Kors sacks Selma Michael Cloute 80OZnkwPNX 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 → MoisLaurent 3 Emploi Trouve HyzyLivres Je Un En eIEDYbHW92

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