国产黄色免费网站_久久天天做天天爱综合色_精品国产一区久久久_成人黄色激情网站_久久成人在线视频_美女一区二区在线观看_亚洲精品免费一区亚洲精品免费精品一区 _91精品国产综合久久精品麻豆

用Flow提升前端代碼健壯性

2018-4-26    seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

看一段常見(jiàn)代碼:

//例1 function foo(x) { return x + 10 }
foo('Hello!') //例2 function main(params){ //fn1函數(shù)獲取了一個(gè)數(shù)據(jù) var object = fn1(params) //fn2根據(jù)獲數(shù)據(jù),產(chǎn)生一個(gè)結(jié)果 var result = fn2(object) return result
}
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

例2很明顯,這個(gè)過(guò)程非常的‘黑’,如果你想知道object包含什么數(shù)據(jù)的話,可以:

  1. 打印一下 console.log(object)
  2. 查看fn1的注釋,并且保佑它的注釋是正確,全面的
  3. 或結(jié)合1,2,然后仔細(xì)查看fn1的源碼,希望它不是很復(fù)雜

被上述步驟折磨完之后,終于能真正的寫點(diǎn)代碼了,但是依舊得非常小心,因?yàn)檫@里還有另一個(gè)函數(shù):fn2

在修改代碼的時(shí)候,得保證result這個(gè)結(jié)果沒(méi)有被影響,那么如何保證呢?

很簡(jiǎn)單,重復(fù)上面的步驟,搞清楚result包含的數(shù)據(jù),在測(cè)試的時(shí)候確保其數(shù)據(jù)跟原先的相同。 

動(dòng)態(tài)類型一時(shí)爽,代碼重構(gòu)火葬場(chǎng) 
知乎傳送門:為什么說(shuō)“動(dòng)態(tài)類型一時(shí)爽,代碼重構(gòu)火葬場(chǎng)”

是時(shí)候徹底優(yōu)化這個(gè)煩人的問(wèn)題了

引入類型系統(tǒng)

其實(shí)問(wèn)題的根源就是因?yàn)閖avascript太靈活了,在代碼運(yùn)行期間幾乎可以做任何的修改,

沒(méi)有東西可以在代碼層面保證 某個(gè)變量,某個(gè)函數(shù) 跟預(yù)期的一致

所以要加入類型系統(tǒng)來(lái)確保代碼的可靠性,在后期維護(hù)的時(shí)候同樣能夠傳達(dá)出有效的信息

Flow & TypeScript

Flow是個(gè)JavaScript的靜態(tài)類型檢查工具,由Facebook出品的開源碼項(xiàng)目,問(wèn)世只有兩三年,是個(gè)相當(dāng)年輕的項(xiàng)目。簡(jiǎn)單來(lái)說(shuō),它是對(duì)比TypeScript語(yǔ)言的解決方式。

會(huì)有這類解決方案,起因是JavaScript是一種弱(動(dòng)態(tài))數(shù)據(jù)類型的語(yǔ)言,弱(動(dòng)態(tài))數(shù)據(jù)類型代表在代碼中,變量或常量會(huì)自動(dòng)依照賦值變更數(shù)據(jù)類型,而且類型種類也很少,這是直譯式腳本語(yǔ)言的常見(jiàn)特性,但有可能是優(yōu)點(diǎn)也是很大的缺點(diǎn)。優(yōu)點(diǎn)是容易學(xué)習(xí)與使用,缺點(diǎn)是像開發(fā)者經(jīng)常會(huì)因?yàn)橘x值或傳值的類型錯(cuò)誤,造成不如預(yù)期的結(jié)果。有些時(shí)候在使用框架或函數(shù)庫(kù)時(shí),如果沒(méi)有仔細(xì)看文件,亦或是文件寫得不清不楚,也容易造成誤用的情況。

這個(gè)缺點(diǎn)在應(yīng)用規(guī)?;瘯r(shí),會(huì)顯得更加嚴(yán)重。我們?cè)趫F(tuán)隊(duì)開發(fā)協(xié)同時(shí),一般都是通過(guò)統(tǒng)一的代碼規(guī)范,來(lái)降低這個(gè)問(wèn)題的發(fā)生,但JS語(yǔ)言本身無(wú)法有效阻止這些問(wèn)題。TypeScript這樣的強(qiáng)(靜態(tài))類型的JavaScript超集語(yǔ)言就開始流行,用嚴(yán)格的角度,以JavaScript語(yǔ)言為基底,來(lái)重新打造另一套具有強(qiáng)(靜態(tài))類型特性的語(yǔ)言,就如同Java或C#這些語(yǔ)言一樣,這也是為什么TypeScript稱自己是企業(yè)級(jí)的開發(fā)JavaScript解決方案。

TypeScript存在的問(wèn)題

TypeScript自然有它的市場(chǎng),但它有一些明顯的問(wèn)題:

  • 首先是JavaScript開發(fā)者需要再進(jìn)一步學(xué)習(xí),內(nèi)容不少
  • 有一定陡峭的學(xué)習(xí)曲線
  • 已經(jīng)在使用的應(yīng)用代碼,需要整個(gè)改用TypeScript代碼語(yǔ)法,才能發(fā)揮完整的功用。這對(duì)很多已經(jīng)有內(nèi)部代碼庫(kù)的大型應(yīng)用開發(fā)團(tuán)隊(duì)而言,將會(huì)是個(gè)重大的決定,因?yàn)槿绻煌嬷貥?gòu)的路走,將無(wú)法發(fā)揮強(qiáng)(靜態(tài))類型語(yǔ)言的最大效用eg:angular2

*所以許多現(xiàn)行的開源碼函數(shù)庫(kù)或框架,并不會(huì)直接使用TypeScript作為代碼的語(yǔ)言,另一方面因?yàn)門ypeScript并非是普及到一定程度的語(yǔ)言。 
當(dāng)然TypeScript也是個(gè)活躍的開源碼項(xiàng)目,發(fā)展到現(xiàn)在也有一段時(shí)間,它的背后有微軟公司的支持,全新打造過(guò)的Angular2框架中(由Google主導(dǎo)),也采用了TypeScript作為基礎(chǔ)的開發(fā)語(yǔ)言*。

Flow你的新選擇

現(xiàn)在,Flow提供了另一個(gè)新的選項(xiàng),它是一種強(qiáng)(靜態(tài))類型的輔助檢查工具。Flow的功能是讓現(xiàn)有的JavaScript語(yǔ)法可以事先作類型的聲明(定義),在開發(fā)過(guò)程中進(jìn)行自動(dòng)檢查,當(dāng)然在最后編譯時(shí),一樣可以用babel工具來(lái)移除這些標(biāo)記。

相較于TypeScript是另外重新制定一套語(yǔ)言,最后再經(jīng)過(guò)編譯為JavaScript代碼來(lái)運(yùn)行。Flow走的則是非強(qiáng)制與非侵入性的路線。

Flow的優(yōu)點(diǎn)

  • 且易學(xué)易用 
    它的學(xué)習(xí)曲線沒(méi)有TypeScript來(lái)得高,雖然內(nèi)容也很多,但半天學(xué)個(gè)大概,就可以漸進(jìn)式地開始使用
  • Flow從頭到尾只是個(gè)檢查工具 
    不是新的程序語(yǔ)言或超集語(yǔ)言,所以它可以與各種現(xiàn)有的JavaScript代碼兼容,如果你哪天不想用了,就去除掉標(biāo)記就是回到原來(lái)的代碼,沒(méi)什么負(fù)擔(dān)

so

選擇flow.js工具而不選擇TypeScript強(qiáng)類型語(yǔ)言的原因顯而易見(jiàn)? 
flow.js對(duì)工程的侵入性很小,無(wú)需大量的額外工作就能使用起來(lái)

從一個(gè)小例子演示

這種類型不符的情況在代碼中非常容易發(fā)生,例如上面的例1:

function foo(x) { return x + 10 }

foo('Hello!')
    
  • 1
  • 2
  • 3
  • 4
  • 5

x這個(gè)傳參,我們?cè)诤瘮?shù)聲明時(shí)希望它是個(gè)數(shù)字類型,但最后使用調(diào)用函數(shù)時(shí)則用了字符串類型。最后的結(jié)果會(huì)是什么嗎? “Hello!10”,這是因?yàn)榧犹?hào)(+)在JavaScript語(yǔ)言中,除了作為數(shù)字的加運(yùn)算外,也可以當(dāng)作字符串的連接運(yùn)算。想當(dāng)然這并不是我們想要的結(jié)果。

聰明如你應(yīng)該會(huì)想要用類型來(lái)當(dāng)傳參的識(shí)別名,容易一眼看出傳參要的是什么類型,像下面這樣:

function foo(number) { return number + 10 }
    
  • 1
  • 2
  • 3
  • 如果在復(fù)合類型的情況,例如這個(gè)傳參的類型可以是數(shù)字類型也可以是布爾類型,你又要如何寫得清楚?
  • 如果是個(gè)復(fù)雜的對(duì)象類型時(shí),結(jié)構(gòu)又該如何先確定好?
  • 另外還有函數(shù)的返回類型又該如何來(lái)寫?

利用Flow類型的定義方式,來(lái)解決這個(gè)小案例的問(wèn)題,可以改寫為像下面的代碼:

// @flow function foo(x: number): number { return x + 10 }

foo('hi')
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

當(dāng)使用非數(shù)字類型的值作為傳入值時(shí),就會(huì)出現(xiàn)由Flow工具發(fā)出的警告消息,像下面這樣:

[flow] Cannot call foo with 'hi' bound to x because string 1 is incompatible with number 2. (a.getting-start.js:6:5)

如果是要允許多種類型也是很容易可以加標(biāo)記的,假使這個(gè)函數(shù)可以使用布爾與數(shù)字類型,但返回可以是數(shù)字或字符串,就像下面這樣修改過(guò):

// @flow function foo(x: number | boolean): number | string { if (typeof x === 'number') { return x + 10 } return 'x is boolean' }

foo(1)
foo(true)
foo(null) // 這一行有類型錯(cuò)誤消息
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在多人協(xié)同開發(fā)某個(gè)有規(guī)模的JavaScript應(yīng)用時(shí),這種類型的輸出輸入問(wèn)題就會(huì)很常遇見(jiàn)。如果利用Flow工具的檢查,可以避免掉許多不必要的類型問(wèn)題

真實(shí)案例

可能你會(huì)認(rèn)為Flow工具只能運(yùn)用在小型代碼中,其實(shí)不然,Vue源碼中大量使用flowjs中類型檢測(cè): 
此處輸入圖片的描述

Flow使用

此處輸入圖片的描述 
1. flow init 
2. // @flow 或 /* @flow */ 
3. IDE插件 或 flow check 
在Visual Studio Code中因?yàn)樗鼉?nèi)建TypeScript與JavaScript的檢查功能,如果要使用Flow工具來(lái)作類型檢查,需要在用戶設(shè)置中,加上下面這行設(shè)置值以免沖突:

“javascript.validate.enable”: false

4 . babel插件在編譯時(shí)就會(huì)一并轉(zhuǎn)換Flow標(biāo)記

{
  "plugins": [ "transform-flow-strip-types" ] }
    
  • 1
  • 2
  • 3
  • 4
  • 5

Flow支持的數(shù)據(jù)類型

Flow支持原始數(shù)據(jù)類型,如下面的列表:

  • boolean
  • number
  • string
  • null
  • void

類型別名&常見(jiàn)語(yǔ)法

// @flow export type Test = {
  titleOne?: string,
  titleTwo: ?string
} var a: Test = {titleOne:"3",titleTwo:4} var b:string = "" //any export type NavigationGestureDirection = 'horizontal' | 'vertical';

type T = Array<string> var x: T = []
x["Hi"] = 2 //有Flow警告 type TT = Array<Test> var xx:TT = []
xx = [{titleOne: '1',
  titleTwo: false}]

type MyObject = {
  foo: number,
  bar: boolean,
  baz: string,
};

let val:MyObject = {foo:2,bar:false,baz:'444'}; var val1: MyObject = {foo:2,bar:false,baz:null}; var val2: MyObject = {foo:2,bar:false}; function method(val: MyObject):MyObject { return {foo:2,bar:false,baz:'2'}} class Foo { constructor(val: MyObject) { /* ... */ } }
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

React中的應(yīng)用

如果你在React class里面使用了React.PropTypes規(guī)范,你可以對(duì)JSX上的attributes做靜態(tài)類型檢查:

var Hello = React.createClass ({
  propTypes: {
    name: React.PropTypes.string.isRequired
  } ... });
//<Hello/> //Flow就會(huì)發(fā)現(xiàn) 缺少屬性的錯(cuò)誤
//<Hello name={42}/>//屬性類型的錯(cuò)誤
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
import * as React from 'react'; type Props = {
  foo: number,
  bar?: string,
}; function MyComponent(props: Props) {
  props.doesNotExist; // Error! You did not define a `doesNotExist` prop. return <div>{props.bar}</div>;
}

<MyComponent foo={42} />
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

更多關(guān)于支持React的細(xì)節(jié) 請(qǐng)移步 https://flow.org/en/docs/react/components/

藍(lán)藍(lán)設(shè)計(jì)www.newchinaweekly.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)

日歷

鏈接

個(gè)人資料

藍(lán)藍(lán)設(shè)計(jì)的小編 http://www.newchinaweekly.com

存檔

欧美色涩在线第一页| 精品97人妻无码中文永久在线| 欧美精品久久一区| 亚洲精品电影网| 欧美黄色免费网站| 亚洲视频国产视频| 性欧美视频videos6一9| 日韩有码在线播放| 国产性猛交xxxx免费看久久| 91国语精品自产拍在线观看性色 | 国产精品扒开腿做爽爽爽a片唱戏| 久久香蕉视频网站| 欧美一区二区综合| 51精品国产人成在线观看| 性欧美videosex高清少妇| 国产91精品一区二区绿帽| 国产精品日韩在线播放| 久久久久久久久久亚洲| 成人免费在线看片| 波多野结衣综合网| 91网站免费视频| 国产xxxx孕妇| 国产乱码一区二区| 日本免费网站| 精品国产美女福利到在线不卡| 国产女同91疯狂高潮互磨| 国产精品久久久久久久久鸭| 丝袜视频国产在线播放| 深夜福利在线观看直播| 欧美成人精品三级网站| 欧洲亚洲两性| 国产成年精品| 日韩视频精品在线观看| 欧美国产禁国产网站cc| 中文字幕欧美激情一区| 日韩精品一区二| 亚洲美女动态图120秒| 成人激情视频免费在线| 国产欧美日韩视频一区二区三区| 免费日韩视频在线观看| 欧美黄色aaa| 欧美乱大交xxxxx免费| 黄色在线网站| 欧美亚洲色图校园春色| 极品少妇一区二区| 国产精品66部| 欧美高清视频不卡网| 国产精品高潮呻吟久久av无限| h无码动漫在线观看| 黄色香蕉视频在线观看| 欧美大交乱xxxxbbbb| 色呦呦在线视频| 中文字幕免费一区二区| 中文字幕中文字幕一区二区| 中文字幕精品网| 午夜老司机精品| 日韩精品久久久久久久的张开腿让 | 国产一区二区片| 国产在线视频你懂的| www.夜夜| 视频欧美一区| 亚洲大全视频| 亚洲欧美日韩国产成人精品影院 | 三级网站视频在在线播放| 亚洲自拍偷拍网| 亚洲一二三四在线观看| 欧美一性一乱一交一视频| 99在线热播| 日韩专区第三页| 久久久久国产精品夜夜夜夜夜| 亚洲天堂avav| 国产你懂的在线观看| 超碰激情在线| 久久黄色级2电影| 亚洲天堂精品视频| 久99久在线视频| 狠狠干一区二区| 老司机福利在线观看| 有没有片在线看www| 三级黄视频在线观看| 国产伦久视频在线观看| 爽爽淫人综合网网站| 国产精品视频yy9299一区| 久久久久久久av麻豆果冻| 色综合久久久网| www日韩欧美| 国产男女免费视频| 国产chinasex对白videos麻豆| 老司机免费在线视频| 激情亚洲另类图片区小说区| 久久久久久久久99精品| 色综合久久中文字幕综合网小说| 国产一区视频免费观看| 综合五月激情网| 免费激情网址| 亚洲大全视频| 日韩一区二区三区视频在线观看| 亚洲一二三区精品| 国产又粗又猛视频| 特黄特色大片免费视频大全| 欧州一区二区| 欧美日韩国产综合视频在线观看| 午夜精品国产精品大乳美女| 伊人五月天婷婷| 国产精品久久久久久久久久久久久久久久久久 | 在线永久看片免费的视频| 波多野结衣在线网站| 免费久久99精品国产| 日韩在线观看你懂的| 久久综合九色99| 免费在线观看黄网站| 你懂的视频网| 欧美日韩一区二区三区四区不卡| 亚洲成a人片综合在线| 国语自产精品视频在免费| 日本少妇xxxx| caoporen人人| 日韩欧美中文在线观看| 亚洲一区二区三区三| 欧美高清性xxxxhdvideosex| 亚洲一区二区三区日韩| 四虎永久成年免费影院| 在线播放免费av| 国产精品分类| 亚洲精品一区二区久| 亚洲欧美日韩精品综合在线观看| 992在线观看| 激情综合闲人网| 国产成人8x视频一区二区| 亚洲精品视频二区| 手机在线视频一区| 免费的很黄很污的视频网站| 99国产精品私拍| 欧美人在线视频| 激情无码人妻又粗又大| 69xxxx欧美| 国产视频一区二区在线观看| 欧美激情精品久久久久久久变态 | 97在线免费公开视频| 污的视频网站| 日本亚洲视频| 欧洲人成人精品| 国产一区二区三区色淫影院 | 欧美日韩久久久久| 国产精品久久久久久久久久东京 | 日本高清不卡一区| 国产精华一区二区三区| 一二三四区在线| 波多野结衣欧美| 亚洲美女屁股眼交| 亚洲国产精品123| 日本男人天堂网| 综合精品一区| 欧美国产日韩精品| 在线观看亚洲天堂| 日韩久久一区| 欧美www视频| 欧美精品卡一卡二| 国产v在线观看| 日韩精品欧美大片| 欧美日韩在线一区| 免费男同深夜夜行网站| 国产美女免费观看| 黄色免费成人| 2019最新中文字幕| 探花国产精品一区二区| www在线免费观看视频| 亚洲日本一区二区| 午夜免费福利小电影| 日本成年免费网站| 久久久久久一二三区| 一本色道久久88亚洲精品综合| 成人无码一区二区三区| 日韩亚洲一区在线| 午夜精品久久久久久久男人的天堂 | 日本一区二区久久| 欧美午夜性视频| 日本成在线观看| 中文字幕一区二区三区蜜月| 欧美 日韩 国产 高清| 污香蕉视频在线观看| 亚洲免费在线看| 制服丝袜中文字幕第一页| 男人在线资源站| 欧美网站一区二区| 欧美 日韩 国产 成人 在线观看| 久久精品女人天堂av免费观看| 日韩一卡二卡三卡国产欧美| 国产三级精品三级观看| 亚洲精品69| 欧美精品亚州精品| 99热这里只有精品99| 黑人一区二区三区四区五区| 亚洲va电影大全| 波多野结衣黄色网址| 国产欧美日韩精品一区二区免费 | 加勒比海盗1在线观看免费国语版| 区一区二日本| 亚洲成人手机在线| 欧产日产国产精品98|