JS靜態(tài)類型檢查工具Flow使用指南

TypeScript最近大火滩租,很多人在說它與JavaScript不同之處探膊,其中有一點(diǎn)必提的就是類型檢查杠愧。如果我不想用TS寫代碼,還想對原生的JavaScript做類型檢查逞壁,有沒有這樣的工具包呢流济?

FLow:https://flow.org/en/

Flow是由 facebook 開發(fā)的 JavaScript 靜態(tài)類型檢查工具锐锣。下面舉幾個(gè)例子,看看怎么使用绳瘟。

安裝使用

  1. npm init 生成 package.json
  2. npm install --save-dev @babel/core @babel/cli @babel/preset-flow
  3. 創(chuàng)建.babelrc雕憔,配置
{
  "presets": ["@babel/preset-flow"]
}
  1. npm install --save-dev flow-bin
  2. 在package.json中的腳本中添加
 "scripts": {
    "flow":"flow",
  }
  1. npm run flow init 初始化flow,生成.flowconfig
  2. 創(chuàng)建測試文件 test-flow.js糖声,添加代碼
function foo(x: ?number): number {
    if (x) {
        return x;
    }
    return 0;
}

foo('hi')
  1. 運(yùn)行 npm run flow
image.png

類型檢查成功斤彼!

幾個(gè)例子

  1. 混合類型的檢查

如果想要檢查的類型可能是 string 也可能是 number 怎么辦?Flow 也支持多種類型的檢查蘸泻。

function foo(value: string | number) {
  return '' + value;
}

foo(123) // Works!
foo('hi') // Works!
foo(true) // Error!
  1. 可選類型

在代碼中傳遞 null 和 undefined 的很常見的琉苇,如何在這種情況下檢查類型呢。我們需要在類型前面加一個(gè)悦施?并扇,比如?number

// @flow
function foo(value: ?number) {
  // ...
}

foo(42);        // Works!
foo();          // Works!
foo(undefined); // Works!
foo(null);      // Works!
foo("42");      // Error!

如果你的參數(shù)是一個(gè)對象,沒有屬性key抡诞,應(yīng)該怎么合理檢查呢穷蛹?

// @flow
function foo({ value }: { value?: ?number }) {
  // ...
}

foo({ value: undefined }); // Works!
foo({});                   // Works!
  1. 類檢查
// @flow

class Bar {
  x: string;          
  y: string | number; 
  z: boolean;

  constructor(x: string, y: string | number) {
    this.x = x
    this.y = y
    this.z = false
  }
}

var bar: Bar = new Bar('hello', 4)
  1. 自定義類型檢查

像 Vue 、React 這樣的框架不止有基本類型昼汗,肯定有自己定義的類型肴熏,那 Flow 是怎么執(zhí)行檢查的呢?

為了解決這類問題顷窒,F(xiàn)low 提出了一個(gè) libdef 的概念蛙吏,可以用來識別這些第三方庫或者是自定義類型。在.flowconfig 的 [libs] 部分用來描述包含指定庫定義的目錄蹋肮。

Vue 就是采用 Flow 進(jìn)行靜態(tài)類型檢查的出刷,在源碼目錄下可以看到一個(gè) .flowconfig 文件,[libs] 指向 flow 文件夾坯辩,打開文件夾馁龟,文件結(jié)構(gòu)是:

flow
├── compiler.js        # 編譯
├── component.js       # 組件
├── global-api.js      # Global API
├── modules.js         # 第三方庫
├── options.js         # 選項(xiàng)
├── ssr.js             # 服務(wù)端渲染
├── vnode.js           # 虛擬 node 
├── weex.js            # weex

可以看到,Vue.js 有很多自定義類型的定義漆魔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坷檩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子改抡,更是在濱河造成了極大的恐慌矢炼,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阿纤,死亡現(xiàn)場離奇詭異句灌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門胰锌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骗绕,“玉大人,你說我怎么就攤上這事资昧〕晖粒” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵格带,是天一觀的道長撤缴。 經(jīng)常有香客問我,道長叽唱,這世上最難降的妖魔是什么屈呕? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮尔觉,結(jié)果婚禮上凉袱,老公的妹妹穿的比我還像新娘。我一直安慰自己侦铜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布钟鸵。 她就那樣靜靜地躺著钉稍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棺耍。 梳的紋絲不亂的頭發(fā)上贡未,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機(jī)與錄音蒙袍,去河邊找鬼俊卤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛害幅,可吹牛的內(nèi)容都是我干的消恍。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼以现,長吁一口氣:“原來是場噩夢啊……” “哼狠怨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邑遏,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤佣赖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后记盒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體憎蛤,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年纪吮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俩檬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萎胰。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖豆胸,靈堂內(nèi)的尸體忽然破棺而出奥洼,到底是詐尸還是另有隱情,我是刑警寧澤晚胡,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布灵奖,位于F島的核電站,受9級特大地震影響估盘,放射性物質(zhì)發(fā)生泄漏瓷患。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一遣妥、第九天 我趴在偏房一處隱蔽的房頂上張望擅编。 院中可真熱鬧,春花似錦箫踩、人聲如沸爱态。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锦担。三九已至,卻和暖如春慨削,著一層夾襖步出監(jiān)牢的瞬間洞渔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工缚态, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留磁椒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓玫芦,卻偏偏與公主長得像浆熔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子姨俩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • babel官網(wǎng) babel 介紹 Babel 是一個(gè)通用的多用途 JavaScript 編譯器蘸拔。通過 Babel ...
    鋒享前端閱讀 1,813評論 0 10
  • 在分析Vue的源碼之前我們需要了解一些前置知識,如Flow环葵、源碼目錄调窍、構(gòu)建方式、編譯入口等张遭。 認(rèn)識 Flow Fl...
    oWSQo閱讀 1,079評論 1 2
  • 在vue2.0的項(xiàng)目中加入flow類型檢查邓萨。當(dāng)前項(xiàng)目是用js寫的,當(dāng)項(xiàng)目越來越大,由于js弱類型的特性缔恳,相比ts(...
    ltinyho閱讀 1,698評論 0 50
  • 33宝剖、JS中的本地存儲 把一些信息存儲在當(dāng)前瀏覽器指定域下的某一個(gè)地方(存儲到物理硬盤中)1、不能跨瀏覽器傳輸:在...
    萌妹撒閱讀 2,079評論 0 2
  • babel官網(wǎng) babel 介紹 Babel 是一個(gè)通用的多用途 JavaScript 編譯器歉甚。通過 Babel ...
    不得不愛XIN閱讀 1,117評論 0 9