Flow adds support for both union and intersection types. A union type requires for a value to be one of the input types.
/* @flow */ type U = number | string; var x: U = 1; x = "two";
An intersection type requires a value to be all of the input types:
/* @flow */
type I = {a: number} & {b: number};
var x: I = {a: 1, b: 2};
x = {a: 1, b: 2, c: "three"}; The value {a:1,b:2,c:"three"} is admissible here because the I only requires that properties a and b are present.
<type 1> | <type 2> ... | <type n>
<type 1> & <type 2> ... & <type n>
/* @flow */
class A {}
class B {}
class C {}
var x: A | B | number | C = new C();
x = 3;
x = new B();
x = true; // Flow will error here x is the union of A, B, number and C. So x can be assigned to any of those types. It cannot, however, be assigned a boolean.
/tmp/flow/f.js:9:5,8: boolean This type is incompatible with /tmp/flow/f.js:2:7,7: A /tmp/flow/f.js:9:5,8: boolean This type is incompatible with /tmp/flow/f.js:3:7,7: B /tmp/flow/f.js:9:5,8: boolean This type is incompatible with /tmp/flow/f.js:4:7,7: C /tmp/flow/f.js:9:5,8: boolean This type is incompatible with /tmp/flow/f.js:6:16,21: number
/* @flow */
class Foo {}
class Bar {}
declare var f: ((x: Foo) => void) & ((x: Bar) => void);
f(new Foo());
f(true); // Flow will error here. f is intersected on function that take a Foo or Bar. Trying to pass in a boolean will cause a type error.
/tmp/flow/f.js:6:3,6: boolean This type is incompatible with /tmp/flow/f.js:2:7,9: Foo /tmp/flow/f.js:6:3,6: boolean This type is incompatible with /tmp/flow/f.js:3:7,9: Bar
© 2013–present Facebook Inc.
Licensed under the BSD License.
https://flowtype.org/docs/union-intersection-types.html