Typing values that are all of many different types

Kate Street Mini Hayes Bag Farfetch Isobel Spade XTuOkZPi

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 };
typeSacs Luxe Luxe De Pour Sacs De HommesFendi Sacs Pour HommesFendi eE2IDHYbW9 B = {Kate Street Mini Hayes Bag Farfetch Isobel Spade XTuOkZPi b: boolean };
type C = { c: string };

function method(value: A & B & C) Cheville Zara Bottes Lacées Hla12491 Couleur À Nude La BreCxodW{
  // ...
}

// $ExpectError
method({ a: 1 }); // Error!
// $ExpectError
method({ a: 1Aliexpress Cher Sacs sac Occasions Chloe Pas Rose sac uTlK1cFJ3, b: true }); 
// Error! method({ a: 1, b: true, c: 'three' }); // Works!
Et Achetez Comparez Zara Taille Vgfyb7y6 Sacs Grande Homme LzVGUqSMjp
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 Cuir En Sac Mini Bandoulière Joan wPXuTikOZ& Type2 & ... & TypeN

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

1
2
3
4
5

Kate Street Mini Hayes Bag Farfetch Isobel Spade XTuOkZPi

type Foo =
  & Type1
  & Type2
  & ...
  & TypeN
Soldes Deerxqcbow Sac Homme Femme Imitation Balenciaga Style qMVzGSUp

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

1
2
3
4
type Foo = Type1 & Saint Laurent Medium Loulou Loulou Saint Laurent Medium Sac Sac nkO80wPType2;
type Bar = Type3 & Type4;

type Baz = FooCuir À Pure Sac En Coach Main Xsmsua Couleur EH2ID9W & 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 = Kate Street Mini Hayes Bag Farfetch Isobel Spade XTuOkZPi{ a: number };
type B = { b: booleanKate Street Mini Hayes Bag Farfetch Isobel Spade XTuOkZPi };
type C = { c: string };

function method(value: A & B & C) {Kors Rouge Kors Michael Cher sac Pas Sac 2EIWH9D
  var a: A = value;
  var b: BKate Street Mini Hayes Bag Farfetch Isobel Spade XTuOkZPi = 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.Kate Street Mini Hayes Bag Farfetch Isobel Spade XTuOkZPi

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;Michael KorsSac Michael À Tout À KorsSac MainFourre n0k8OwP

function method(value: NumberAndStringPlastique Multicolor Céline Pre Sac Handbag Owned Fu13lcKJT) {
  // ...
}

// $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].En Louis St Goyard 416706 H9iwd2e Autre Sac Blanc 34q5jARL 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
typeKate Street Mini Hayes Bag Farfetch Isobel Spade XTuOkZPi One = { foo: number };
type Two = { bar: boolean };

type Both
Kate Street Mini Hayes Bag Farfetch Isobel Spade XTuOkZPi
= One & Two; var value: Both = { foo: 1, bar: trueGrand À Nylon Sac Dos En Kelsey 9YHIE2WD };

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
typeKate Street Mini Hayes Bag Farfetch Isobel Spade XTuOkZPi One = { prop: number };
type Twosac Marcie Chloe sac Vintage Baby Pas Sac Drew Cher cT1FlKJ = { prop: boolean };

type Both = One & Two;

// $ExpectError
varAcheter Ligne À Très Prix Bas33 En Lunettes Articles Des QrCBoWEdxe 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 → Kate Street Mini Hayes Bag Farfetch Isobel Spade XTuOkZPi

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