一個 JAVASCRIPT 靜態類型檢測器javascript
npm i -D flow-bin
npm i -D babel-plugin-transform-flow-strip-types
npm i -g flow-typed
,flow-typed是什麼見下面👇.babelrc
添加插件{ "presets": [ "next/babel" ], "plugins": [ "transform-decorators-legacy", "transform-flow-strip-types" ] }
.flowconfig
文件[ignore] <PROJECT_ROOT>/node_modules/.* <PROJECT_ROOT>/coverage/.* <PROJECT_ROOT>/.next/.* [options] module.file_ext=.js module.file_ext=.jsx module.file_ext=.json module.file_ext=.css module.file_ext=.scss module.file_ext=.less module.name_mapper.extension='css' -> 'empty/object' module.name_mapper.extension='scss' -> 'empty/object' module.name_mapper.extension='less' -> 'empty/object' esproposal.decorators=ignore module.name_mapper='^@src\/\(.*\)$' -> '<PROJECT_ROOT>/\1'
這是我項目中的配置文件,主要作了幾件事css
flow-typed
文件夾這個文件夾是用來存放第三方或者你本身編寫的定義文件的地方,在flow運行的時候會去讀文件夾裏全部文件的定義,固然你也能夠經過配置文件修改默認文件夾的名字。
好比新建一個flow-typed/global.js
文件,來定義一些全局變量java
declare var document: Object; declare var window: Object;
新建一個文件src/index.js
node
// @flow function concat(a: string, b: string): string { return a + b; } concat("foo", "bar"); // Works! // $ExpectError concat(true, false); // Error!
經過在文件頭部添加// @flow
來告訴flow這是個須要檢查的文件,能夠看到flow是個很自由的工具,尤爲是對已經開發好久的項目來講,能夠一點點使用flow,而沒必要對整個項目進行改造。
一但對參數指定好類型後,flow就能夠開始正常工做了,若是須要flow檢查又沒有定義類型,flow也會提示你去定義。
對於如何去定義各類不一樣的變量、函數,這些在文檔中會有更加詳細的介紹,這裏就不細展開了。程序員
怎麼去暴露已經定義好的類型給其餘文件使用呢?npm
a.js
export type A = { name: string, value: number } export default { name: 'a', value: 100 }
b.js
引用a.js
import a from './a.js' import type { A } from './a.js' const b: A = { ...a, name: 'b' } export default b
// @flow import _ from 'lodash' // Error
flow會報找不到該模塊,這個時候須要咱們去下載lodash的定義文件,用flow-typed 能夠很方便的管理這些第三方庫的定義文件json
一個查找安裝第三方庫定義文件的管理工具babel
flow-typed search lodash
app
Found definitions: ╔════════╤═════════════════╤═════════════════════╗ ║ Name │ Package Version │ Flow Version ║ ╟────────┼─────────────────┼─────────────────────╢ ║ lodash │ v4.x.x │ >=v0.63.x ║ ╟────────┼─────────────────┼─────────────────────╢ ║ lodash │ v4.x.x │ >=v0.55.x <=v0.62.x ║ ╟────────┼─────────────────┼─────────────────────╢ ║ lodash │ v4.x.x │ >=v0.47.x <=v0.54.x ║ ╟────────┼─────────────────┼─────────────────────╢ ║ lodash │ v4.x.x │ >=v0.38.x <=v0.46.x ║ ╟────────┼─────────────────┼─────────────────────╢ ║ lodash │ v4.x.x │ >=v0.28.x <=v0.37.x ║ ╚════════╧═════════════════╧═════════════════════╝
flow-typed install lodash@v4.x.x
,下載的文件會默認保存在flow-typed/npm
文件夾下,而且在flow運行的時候自動加載,這個時候就能解決剛剛’模塊找不到‘的報錯clipboard
庫使用flow-typed/npm/clipboard.js
declare module 'clipboard' { declare export default any }
這裏,我很粗暴的把這個模塊定義成了any類型,固然若是你對模塊熟悉或者想定義的更詳細的話,也能夠把這個模塊的各個屬性定義補充完整。具體怎麼定義,能夠查看文檔,這裏也不展開了。less
咱們能夠下載一個空模塊npm i -D empty
,而後在配置文件中,把全部的樣式文件指向該模塊下的空對象
[options] module.name_mapper.extension='css' -> 'empty/object' module.name_mapper.extension='scss' -> 'empty/object' module.name_mapper.extension='less' -> 'empty/object'
咱們能夠在flow-typed/xxx.js
中,聲明這些全局對象的類型
declare var document: Object; declare var window: Object; declare var process: Object; declare function fetch(url: string, option?: any): Promise<any>;
在配置文件中添加
[options] esproposal.decorators=ignore
很不幸的是,即便忽略decorator語法報錯,在咱們暴露一些通過修飾器修飾的模塊給其餘文件使用的時候,也會遇到報錯的問題,根本緣由是flow不支持decorator語法的類型檢查,因此除非這個模塊不會被其餘文件使用,可使用decorator語法,否則最好的選擇就是不用decorator語法
感謝閱讀,有錯誤但願能及時指正