2018-4-26 seo達人
如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點這里
例2很明顯,這個過程非常的‘黑’,如果你想知道object包含什么數(shù)據(jù)的話,可以:
被上述步驟折磨完之后,終于能真正的寫點代碼了,但是依舊得非常小心,因為這里還有另一個函數(shù):fn2
在修改代碼的時候,得保證result這個結(jié)果沒有被影響,那么如何保證呢?
很簡單,重復上面的步驟,搞清楚result包含的數(shù)據(jù),在測試的時候確保其數(shù)據(jù)跟原先的相同。
動態(tài)類型一時爽,代碼重構(gòu)火葬場
是時候徹底優(yōu)化這個煩人的問題了
其實問題的根源就是因為javascript太靈活了,在代碼運行期間幾乎可以做任何的修改,
沒有東西可以在代碼層面保證 某個變量,某個函數(shù) 跟預期的一致。
所以要加入類型系統(tǒng)來確保代碼的可靠性,在后期維護的時候同樣能夠傳達出有效的信息
Flow是個JavaScript的靜態(tài)類型檢查工具,由Facebook出品的開源碼項目,問世只有兩三年,是個相當年輕的項目。簡單來說,它是對比TypeScript語言的解決方式。
會有這類解決方案,起因是JavaScript是一種弱(動態(tài))數(shù)據(jù)類型的語言,弱(動態(tài))數(shù)據(jù)類型代表在代碼中,變量或常量會自動依照賦值變更數(shù)據(jù)類型,而且類型種類也很少,這是直譯式腳本語言的常見特性,但有可能是優(yōu)點也是很大的缺點。優(yōu)點是容易學習與使用,缺點是像開發(fā)者經(jīng)常會因為賦值或傳值的類型錯誤,造成不如預期的結(jié)果。有些時候在使用框架或函數(shù)庫時,如果沒有仔細看文件,亦或是文件寫得不清不楚,也容易造成誤用的情況。
這個缺點在應用規(guī)模化時,會顯得更加嚴重。我們在團隊開發(fā)協(xié)同時,一般都是通過統(tǒng)一的代碼規(guī)范,來降低這個問題的發(fā)生,但
TypeScript自然有它的市場,但它有一些明顯的問題:
*所以許多現(xiàn)行的開源碼函數(shù)庫或框架,并不會直接使用TypeScript作為代碼的語言,另一方面因為TypeScript并非是普及到一定程度的語言。
現(xiàn)在,Flow提供了另一個新的選項,它是一種強(靜態(tài))類型的輔助
相較于TypeScript是另外重新制定一套語言,最后再經(jīng)過編譯為JavaScript代碼來運行。Flow走的則是非強制與非侵入性的路線。
選擇flow.js工具而不選擇TypeScript強類型語言的原因顯而易見?
這種類型不符的情況在代碼中非常容易發(fā)生,例如上面的例1:
x這個傳參,我們在函數(shù)聲明時希望它是個數(shù)字類型,但最后使用調(diào)用函數(shù)時則用了字符串類型。最后的結(jié)果會是什么嗎? “Hello!10”,這是因為加號(+)在JavaScript語言中,除了作為數(shù)字的加運算外,也可以當作字符串的連接運算。想當然這并不是我們想要的結(jié)果。
聰明如你應該會想要用類型來當傳參的識別名,容易一眼看出傳參要的是什么類型,像下面這樣:
利用Flow類型的定義方式,來解決這個小案例的問題,可以改寫為像下面的代碼:
當使用非數(shù)字類型的值作為傳入值時,就會出現(xiàn)由Flow工具發(fā)出的警告消息,像下面這樣:
[flow] Cannot call
如果是要允許多種類型也是很容易可以加標記的,假使這個函數(shù)可以使用布爾與數(shù)字類型,但返回可以是數(shù)字或字符串,就像下面這樣修改過:
在多人協(xié)同開發(fā)某個有規(guī)模的JavaScript應用時,這種類型的輸出輸入問題就會很常遇見。如果利用Flow工具的檢查,可以避免掉許多不必要的類型問題。
可能你會認為Flow工具只能運用在小型代碼中,其實不然,Vue源碼中大量使用flowjs中類型檢測:
“javascript.validate.enable”: false
4 . babel插件在編譯時就會一并轉(zhuǎn)換Flow標記
Flow支持原始數(shù)據(jù)類型,如下面的列表:
如果你在React class里面使用了React.PropTypes規(guī)范,你可以對JSX上的attributes做靜態(tài)類型檢查:
更多關于支持React的細節(jié) 請移步 https://flow.org/en/docs/react/components/
看一段常見代碼:
…
知乎傳送門:為什么說“動態(tài)類型一時爽,代碼重構(gòu)火葬場”
引入類型系統(tǒng)
Flow & TypeScript
JS語言本身
無法有效阻止這些問題。TypeScript這樣的強(靜態(tài))類型的JavaScript超集語言就開始流行,用嚴格的角度,以JavaScript語言為基底,來重新打造另一套具有強(靜態(tài))類型特性的語言,就如同Java或C#這些語言一樣,這也是為什么TypeScript稱自己是企業(yè)級的開發(fā)JavaScript解決方案。
TypeScript存在的問題
當然TypeScript也是個活躍的開源碼項目,發(fā)展到現(xiàn)在也有一段時間,它的背后有微軟公司的支持,全新打造過的Angular2框架中(由Google主導),也采用了TypeScript作為基礎的開發(fā)語言*。
Flow你的新選擇
檢查工具
。Flow的功能是讓現(xiàn)有的JavaScript語法可以事先作類型的聲明(定義),在開發(fā)過程中進行自動檢查
,當然在最后編譯時,一樣可以用babel工具來移除這些標記。
Flow的優(yōu)點
輕
且易學易用
它的學習曲線沒有TypeScript來得高,雖然內(nèi)容也很多,但半天學個大概,就可以漸進式地開始使用
檢查工具
不是新的程序語言或超集語言,所以它可以與各種現(xiàn)有的JavaScript代碼兼容,如果你哪天不想用了,就去除掉標記就是回到原來的代碼,沒什么負擔
so
flow.js對工程的侵入性很小,無需大量的額外工作就能使用起來
從一個小例子演示
foo
with 'hi'
bound to x
because string 1 is incompatible with number 2. (a.getting-start.js:6:5)
真實案例
Flow使用
1. flow init
2. // @flow 或 /* @flow */
3. IDE插件 或 flow check
在Visual Studio Code中因為它內(nèi)建TypeScript與JavaScript的檢查功能,如果要使用Flow工具來作類型檢查,需要在用戶設置中,加上下面這行設置值以免沖突:
Flow支持的數(shù)據(jù)類型
類型別名&常見語法
React中的應用