摘要:聲明帶類型的函數這里是聲明一個函數,規定了自己需要的參數類型和返回值類型。同理,箭頭函數的寫法這里是聲明變量,規定了它所需的函數的特征參數返回值對比下面這種寫法兩者的聲明的地方不一樣,造成的意義也不同。
在小心翼翼維護項目代碼的時候經常會看到這種代碼
function main(){ //fn1函數獲取了一個數據 var object = fn1() //fn2根據獲數據,產生一個結果 var result = fn2(object) return result }
很明顯,這個過程非常的‘黑’,如果你想知道object包含什么數據的話,可以
打印一下 console.log(object)
查看fn1的注釋,并且保佑它的注釋是正確,全面的
或結合1,2,然后仔細查看fn1的源碼,希望它不是很復雜
被上述步驟折磨完之后,終于能真正的寫點代碼了,但是依舊得非常小心,因為這里還有另一個函數:fn2。
在修改代碼的時候,得保證result這個結果沒有被影響,那么如何保證呢?
很簡單,重復上面的步驟,搞清楚result包含的數據,在測試的時候確保其數據跟原先的相同。
…
是時候徹底優化這個煩人的問題了。
引入類型系統其實問題的根源就是因為javascript太靈活了,在代碼運行期間幾乎可以做任何的修改,
沒有東西可以在代碼運行前就保證 某個變量,某個函數 跟預期的一致。
所以要加入類型系統來確保代碼的可靠性,在后期維護的時候同樣能夠傳達出有效的信息。
facebook出品的flow.js 做的就是這種事情。
使用flow.jsgit 倉庫:https://github.com/facebook/flow
flow 官方文檔:https://flowtype.org/docs/qui...
方便體驗,這里有一個搭好的case集合
基礎類型檢測git clone git@github.com:JavascriptTips/flow-examples.git
flow.js 中定義了的5種最簡單的類型,(warning:都是小寫),其中void對應js中的undefined
boolean
number
string
null
void
要想加入到javascript中,只需要在關鍵的地方聲明想要的類型。其它時間我們的代碼還是熟悉的javascript,代碼如下(flow-examples工程中也有對應js文件):
//flow-examples/src/primitives.js //在文件的頭部加入,用注釋加入 `@flow` 聲明,這樣flow.js才會檢查這個文件。 //@flow //在聲明變量時,在變量名加入 `:[Type]` 來表明變量的類型,其它類型同理。 //這個語法非常像flash的ActionScript,咦?好像暴露了什么。 var num:number = 1; var str:string = "a"; //當然,也可以不加類型,這樣就跟原來的js一樣了。 var variable = "zz";復雜類型檢測
主要有:
Object
Array
函數
自定義Class
這幾個類型比較復雜,而且可以相互嵌套。在flow.js中這幾種類型有非常多的檢查語法,在這里簡單的展示幾項,具體見代碼代碼和官方文檔。
//flow-examples/src/object.js //@flow //Object大寫的O var o:Object = { hello:"h" }; //聲明了Object的key var o2:{key:string} = { key:"z233" };
//flow-examples/src/array.js //@flow //基于基本類似的數組,數組內都是相同類型 var numberArr:number[] = [12,3,4,5,2]; //另一個寫法 var numberAr2r:Array= [12,3,2,3]; var stringArr:string[] = ["12","a","cc"]; var booleanArr:boolean[] = [true,true,false]; var nullArr:null[] = [null,null,null]; var voidArr:void[] = [ , , undefined,void(0)]; //數組內包含各個不同的類型數據 //第4個原素沒有聲明,則可以是任意類型 var arr:[number,string,boolean] = [1,"a",true,function(){},];
函數比較特殊,因為函數的核心在于參數和返回值,函數作文類型本身并沒有作用。
//flow-examples/src/function.js //@flow /** * 聲明帶類型的函數 * 這里是聲明一個函數fn,規定了自己需要的參數類型和返回值類型。 */ function fn(arg:number,arg2:string):Object{ return { arg, arg2 } } //同理,ES2015箭頭函數的寫法 var fn2 = (arg:number,arg2:string):Object => { return { arg, arg2 } } /** * 這里是聲明變量fn2,規定了它所需的函數的特征: * 參數: (arg:string,arg2:number) * 返回值:Object */ var fn3:(arg:string,arg2:number)=>Object = function(){ return {} } /** * 對比下面這種寫法, * 兩者的聲明的地方不一樣,造成的意義也不同。 */ var fn4 = function(arg:string,arg2:Object):number{ return 1; }
聲明一個自定義類,然后用法如同基本類型
//flow-examples/src/class.js //@flow class MyClass{ name:string; constructor(n){ this.name = n; } } var myClass : MyClass = new MyClass("abc");引入flow.js
可以看到加入flow.js語法后,正常的js引擎肯定是不能跑的。
這時就要借助萬能的babel編譯這些js。
1.如果是正經的帶webpack + babel 的前端項目,可以無縫集成,加入babel插件即可:
babel-plugin-transform-flow-strip-types
2.如果只是跑一下測試這些js,可以直接在flow-examples工程中,如下:
npm run fnode src/object.js
其它跑起來的方法,可以在官方文檔查看
結論這里只是介紹了flow.js一部分的特性,在引入flow.js之后,js只需要很小的改動就能得到增強,在關鍵的地方確保邏輯的準確性。
更進一步,再結合js的函數式編程特性,以類型和函數驅動開發,感覺很cool.
一點微小的疑問這里2個小問題,
為什么是flow.js 而不是其它編譯到js的強類型語言,如TypeScript ?
答:我非常喜歡js的靈活性,它為編程帶來極大便捷。而且flow.js對工程的侵入性很小,無需大量的額外工作就能使用起來。
為什么不加強注釋,完善注釋,而是再加入一個工具?
答:因為寫注釋很煩,并且有無注釋不會影響代碼執行。flow.js則是一種基本保障,確保檢查無誤才能運行。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80454.html
摘要:這些優勢,其實都是類型系統所帶來的強類型語言所具有的開發優勢,無論是在開發體驗還是后期項目維護上,都要優于目前的。 大半夜的JavaScript Weekly發來賀電:TypeScript 2.0 Final Released! 沒錯,繼Angular2發布之后,TypeScript今天也發布了2.0版本,這不禁讓我浮想一番。如果要說TS和JS最明顯的差別,我想一定是Type Syst...
摘要:本文主要介紹了解決作為弱類型語言沒有類型檢查痛點的靜態類型檢查工具,并且介紹了在中使用的方法,最后介紹了一些常用的語法。 本文主要介紹了解決JS作為弱類型語言沒有類型檢查痛點的靜態類型檢查工具 Flow ,并且介紹了在WebStorm中使用Flow的方法,最后介紹了一些常用的Flow語法。 1. 簡介 JS作為一種腳本語言是沒有類型檢測的,這個特點有時候用著很方便,但在一個較大的項目中...
摘要:擴展靜態類型檢查語言與系列等語言有一點很大的不同,就是語言是弱類型語言。但其實很多開發人員還是比較喜歡用來開發項目,所以開發出來幫助語言擴展靜態類型檢查功能,規避上面提到的問題。 js 擴展:靜態類型檢查(facebook flow) js 語言與 java、C 系列等語言有一點很大的不同,就是 js 語言是弱類型語言。js 語言的這個特性可能讓大家覺得 js 很自由,沒有強制性的約束...
摘要:介紹是個的靜態類型檢查工具,由出品的開源碼項目,問世只有一年多,是個相當年輕的項目。現在,提供了另一個新的選項,它是一種強靜態類型的輔助檢查工具。 showImg(https://segmentfault.com/img/bVH6mL?w=1200&h=675); 本章的目標是提供一些Flow工具的介紹與使用建議。Flow本質上也只是個檢查工具,它并不會自動修正代碼中的錯誤,也不會強制...
閱讀 1949·2023-04-26 01:59
閱讀 3264·2021-10-11 11:07
閱讀 3295·2021-09-22 15:43
閱讀 3374·2021-09-02 15:21
閱讀 2549·2021-09-01 10:49
閱讀 901·2019-08-29 15:15
閱讀 3089·2019-08-29 13:59
閱讀 2829·2019-08-26 13:36