O Flow não quer forçar o desenvolvedor web a usar a camisa de força de tipos estáticos, realizando a maior parte de seu trabalho usando a inferência de tipos, sempre que possível e permite especificar quais arquivos JavaScript devem ser verificados e quais não. Quando desejado, os desenvolvedores podem utilizar a rigorosa verificação de tipo semelhante a verificação fornecida pelo TypeScript.
Quando o Flow foi projetado, o Facebook presupoe que a maioria dos códigos JavaScript existente já possuam alguma forma de "tipagem estática implícita" e considera que "mesmo que tipos não possam aparecer em qualquer parte do código, eles estão na mente do desenvolvedor como uma maneira de raciocinar sobre a correção do código", como explicado em um post no blog. Assim, o Facebook considera sua abordagem para verificações de tipo para JavaScript bastante diferente do TypeScript que faz "uma suposição mais fraca que a maior parte do código JavaScript é tipado de forma dinâmica, e que cabe ao desenvolvedor expressar o seu código de forma passível de tipagem estática." Como resultado, o Flow apontará o seguinte trecho de código como errado, sem a necessidade anotações de tipo explícitas:
function onlyWorksOnNumbers(x) { return x * 10; } onlyWorksOnNumbers('Hello, world!');
Esta abordagem pode poupar uma grande quantidade de código necessária para grandes projetos. Em resumo, algumas das características do Flow são:
- Tipos primitivos: Number, String e boolean, proibindo conversões implícitas entre eles
- Os tipos estruturados associados a funções, objetos e matrizes;
- Tipos polimórficos;
- Suporta uma série de características do ECMAScript 6: desestruturação, classes, objetos estendidos, funções com parâmetros opcionais, Mapa, Set e Promise;
- Suporta JSX e React.
O Flow sabe como lidar com null e undefined para se certificar de que eles não geram erros em tempo de execução. Por exemplo, este código gera um erro:
function length(x) { return x.length; } var total = length('Hello') + length(null);
Enquanto este não gera:
function length(x) { if (x !== null) { return x.length; } else { return 0; } } var total = length('Hello') + length(null);
O Flow está ciente de módulos para Node.js, sendo escalável através da execução no servidor e propagando o trabalho dos módulos entre vários servidores. Podendo exigir anotações para os tipos que devem ser acessados a partir de outros módulos.
O Flow é mais uma ferramenta para verificação de tipos JavaScript na caixa de ferramentas do desenvolvedor web, juntamente com o TypeScript da Microsoft e AtScript do Google. Ambas as ferramentas, Flow e AtScript, tem uma sintaxe para tipos muito semelhante ao TypeScript, mas fornecem recursos extras não existente na ferramenta da Microsoft.
O TypeScript é atualmente um subconjunto de funcionalidades do ES6 e que como consta no roteiro de atualizações suportará a maioria, se não todas, as funcionalidades presentes na versão 2 do ES6. A tipagem opcional é suportado pelo TypeScript através de anotações, tipos genéricos, interfaces e modificadores de visibilidade.
O AtScript tem como meta o ES6 e também fornecer tipo, campo e anotações de metadados, além de fazer reflexão da API em tempo de execução através das anotações. Ele foi criado para ser compatível com ES5, e atualmente pode ser compilado para ES5 e Dart.
De acordo com Avik Chaudhuri, o Facebook optou por desenvolver o Flow em vez de usar TypeScript, pois melhora a escalabilidade para grandes bases de código e tem um melhor controle sobre o React. Eles conseguiram inferir mais tipos, mesmo para códigos-fonte que estão sem anotação e pelo motivo que o Flow sabe como lidar com nulo ou indefinido. Para uma comparação mais aprofundada das três tecnologias recomendamos a leitura do post no blog do Axel Rauschmayer "Tipagem estática em via Microsoft TypeScript, Facebook Flow e Google AtScript".
Pode-se questionar o porque de tantas diferentes soluções para verificação de tipos em JavaScript e o que devemos fazer sobre tudo isso. A boa notícia é que a Microsoft, Facebook e Google estão colaborando sobre estas soluções, de acordo com Jonathan Turner da Microsoft:
A equipe do TypeScript está trabalhando com as duas equipes, Flow e AtScript, para ajudar a garantir que os recursos que já foram criadas pela comunidade de JavaScript possa ser usado em toda essas ferramentas. Há muita coisa e estes projetos podem aprender uns com os outros, e estamos ansiosos para trabalhar juntos daqui para frente e criando as melhores ferramentas que podemos para a comunidade. No longo prazo, também estamos trabalhando para dobrar as melhores características destas ferramentas em ECMAScript, o padrão por trás JavaScript.
O Flow vem com binários para Linux e Mac OS X e o código-fonte está disponível no GitHub.