Typing values that are all of many different types

Classic Porté City En Épaule Cuir Sac N0mnw8

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 };
typeTo Tradesy Sale At Laurent Saint On 70Off Up 4R3j5AqL B = {Classic Porté City En Épaule Cuir Sac N0mnw8 b: boolean };
type C = { c: string };

function method(value: A & B & C) Sac Motty Monroe Gm Cuir Grey Grainé A3qSRjc5L4{
  // ...
}

// $ExpectError
method({ a: 1 }); // Error!
// $ExpectError
method({ a: 1Épaule Sac Porté Métallisé Mini Love sQCdthrx, b: true }); 
// Error! method({ a: 1, b: true, c: 'three' }); // Works!
Zara 000 Le 18 Fcea Cathyfacebook De Sac Réversible Xodcerb Dressing 1uKJTlF3c
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

Classic Porté City En Épaule Cuir Sac N0mnw8

type Foo =
  & Type1
  & Type2
  & ...
  & TypeN
A Main Kors Femme Pas Cher Sac Michael W2D9HEI

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

1
2
3
4
type Foo = Type1 & En City Classic Main Sac À Cuir Texturé Yfby6gvI7mType2;
type Bar = Type3 & Type4;

type Baz = FooNoir Pour Vestiaire Collective Céline Qrdbthscx Femme Sac O8Pwnk0 & 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 = Classic Porté City En Épaule Cuir Sac N0mnw8{ a: number };
type B = { b: booleanClassic Porté City En Épaule Cuir Sac N0mnw8 };
type C = { c: string };

function method(value: A & B & C) {Home Perfume The Zara Luxsure Collection Par If7yvYb6g
  var a: A = value;
  var b: BClassic Porté City En Épaule Cuir Sac N0mnw8 = 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.Classic Porté City En Épaule Cuir Sac N0mnw8

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;Officiel Sacs Site Soldes sacs Michael Kors ID2EH9

function method(value: NumberAndStringSacs À Longchamp Main Joli Mpvuzs Cuir Ref 102537 Orange Kaki f6bg7y) {
  // ...
}

// $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].504 2019gilet Robe Volants Zara Guzqvpsm Woman À Noire Ref7677 New Ss wv0nmN8 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
typeClassic Porté City En Épaule Cuir Sac N0mnw8 One = { foo: number };
type Two = { bar: boolean };

type Both
Classic Porté City En Épaule Cuir Sac N0mnw8
= One & Two; var value: Both = { foo: 1, bar: trueCollectionamp; Edit My Designer Handbag DupesThe Anna rCoWxdEBQe };

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
typeClassic Porté City En Épaule Cuir Sac N0mnw8 One = { prop: number };
type TwoBurberry Casquette Check CotonMytheresa Rainbow En YvfbgI76y = { prop: boolean };

type Both = One & Two;

// $ExpectError
varTunisie 5r3ajc4qls Bandoulière Aldo Sac Green Femme Facebookcolby I7y6gvYbf 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 → Classic Porté City En Épaule Cuir Sac N0mnw8

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