What’s Flow?
Flow is a static type checker developed by Meta (aka, Facebook), Inc. There are some cool features in Flow:
- Type Annotations
- Enum
- Union Types
- Maybe Types
and etc.
Setup Flow
Install dev tools and plugins
yarn add --dev flow-bin
yarn add flow-enums-runtime
yarn add --dev babel-plugin-transform-flow-enums customize-cra eslint-plugin-fb-flow eslint-plugin-ft-flow react-app-rewired
Create react-app-rewired config overrides
Create a file named config-overrides.js:
const { override, useBabelRc } = require("customize-cra");
module.exports = override(useBabelRc(), (config, env) => {
  config.plugins.find(
    (p) => p.key === "ESLintWebpackPlugin"
  ).options.useEslintrc = true;
  return config;
});
Setup babel and eslint
Create .babelrc file:
{
    "plugins": [
      "babel-plugin-transform-flow-enums"
    ]
}
and eslintrc:
{
    "extends": ["react-app"],
    "plugins": ["ft-flow", "fb-flow"]
}
Initialize flow config
yarn run flow init
which generates the .flowconfig locally. Override the file with the following contents:
[ignore]
<PROJECT_ROOT>/.history/.*
<PROJECT_ROOT>/node_modules/resolve/test/resolver/malformed_package_json/package.json
[include]
[libs]
[lints]
[options]
enums=true
react.runtime=automatic
[strict]
Update package.json scripts
"scripts": {
  "flow": "flow",
  "start": "react-app-rewired start",
  "build": "react-app-rewired build",
  "test": "react-app-rewired test",
},
Done! Now you’re able to use Flow in your React project!
Flow Examples
Enum
enum ActionType {
    Add,
    Remove,
}
Union Types
// @flow
function toStringPrimitives(value: number | boolean | string) {
  return String(value);
}
toStringPrimitives(1);       // Works!
toStringPrimitives(true);    // Works!
toStringPrimitives('three'); // Works!
Maybe Types
Maybe types accept the provided type as well as null or undefined. So ?number would mean number, null, or undefined.
// @flow
function acceptsMaybeNumber(value: ?number) {
  // ...
}
acceptsMaybeNumber(42);        // Works!
acceptsMaybeNumber();          // Works!
acceptsMaybeNumber(undefined); // Works!
acceptsMaybeNumber(null);      // Works!
acceptsMaybeNumber("42");      // Error!
There are lots of other cool features in Flow. For more, see here;