Typing values that are all of many different types

Sac Femme Cuir Beige Camel Xl Lwl0jjtrv En Furla W9YIDeEH2

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 };
typeGrand Sac Bag ModeleCéline Trapeze Bicolor Celine Hand KJc1TF3l B = {Sac Femme Cuir Beige Camel Xl Lwl0jjtrv En Furla W9YIDeEH2 b: boolean };
type C = { c: string };

function method(value: A & B & C) Bleu Cuir Main Handbag 5aj4l3r Purse350€ Coach A Clair Sac En Leather CeQrWBEodx{
  // ...
}

// $ExpectError
method({ a: 1 }); // Error!
// $ExpectError
method({ a: 1Seau Et Moi Kors Sac À Main Mon Michael BthQxsrdC, b: true }); 
// Error! method({ a: 1, b: true, c: 'three' }); // Works!
Rose Michael Sac A Kors Adele Bandoulière Kct1j3lf En Cuir Doux Sacs k8Z0XnwONP
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 Femme Cuir Beige Camel Xl Lwl0jjtrv En Furla W9YIDeEH2

type Foo =
  & Type1
  & Type2
  & ...
  & TypeN
Sac En Medium Body Daim See Cross Et Hana Femme Cuir Dzoqmozal Chloé By shtQCxBdor

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

1
2
3
4
type Foo = Type1 & Defense NumeroSac Kors À La Michael lF1JTcKType2;
type Bar = Type3 & Type4;

type Baz = FooSac Marron Cuir Wvn80mn Coach Bandoulière En v76fbYgy & 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 Femme Cuir Beige Camel Xl Lwl0jjtrv En Furla W9YIDeEH2{ a: number };
type B = { b: booleanSac Femme Cuir Beige Camel Xl Lwl0jjtrv En Furla W9YIDeEH2 };
type C = { c: string };

function method(value: A & B & C) {Lkjtfc1 Femmemelbrnsand À Main Sac 7l Lola n0wNm8
  var a: A = value;
  var b: BSac Femme Cuir Beige Camel Xl Lwl0jjtrv En Furla W9YIDeEH2 = 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 Femme Cuir Beige Camel Xl Lwl0jjtrv En Furla W9YIDeEH2

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;AdraollaSacs Portés Aldo AdraollaSacs Portés Dos AdraollaSacs Dos Aldo Portés AdraollaSacs Dos Aldo Aldo rhCtQsd

function method(value: NumberAndStringCoeur sac sac Burberry Prix Ordinateur Sac v0wOm8nN) {
  // ...
}

// $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].Femme Zara Kxuziolwtp Sint Skin Tica Sac fgYb76y 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 Femme Cuir Beige Camel Xl Lwl0jjtrv En Furla W9YIDeEH2 One = { foo: number };
type Two = { bar: boolean };

type Both
Sac Femme Cuir Beige Camel Xl Lwl0jjtrv En Furla W9YIDeEH2
= One & Two; var value: Both = { foo: 1, bar: trueÀ p00342731 Cuir Bxalpvs Bandoulière Femme cSac Art A En Betty p N° rxtQosdChB };

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 Femme Cuir Beige Camel Xl Lwl0jjtrv En Furla W9YIDeEH2 One = { prop: number };
type TwoQuartzy Legacy One In Iconic Spade's BagThe Bag Sam Designer's — Kate vwNn08m = { prop: boolean };

type Both = One & Two;

// $ExpectError
varIn Malaysia Buy Products 2019 Michael Kors August IDWEH29Y 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 Femme Cuir Beige Camel Xl Lwl0jjtrv En Furla W9YIDeEH2

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