国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Flow - JS靜態(tài)類型檢查工具

seanHai / 3086人閱讀

摘要:介紹是個的靜態(tài)類型檢查工具,由出品的開源碼項目,問世只有一年多,是個相當(dāng)年輕的項目。現(xiàn)在,提供了另一個新的選項,它是一種強靜態(tài)類型的輔助檢查工具。

本章的目標是提供一些Flow工具的介紹與使用建議。Flow本質(zhì)上也只是個檢查工具,它并不會自動修正代碼中的錯誤,也不會強制說你沒按照它的警告消息修正,就不會讓你運行程序。當(dāng)然,并沒有要求什么時候一定要用這類的工具,只是這種作法可以讓你的代碼更具強健性與提高閱讀性,也可以直接避去很多不必要的數(shù)據(jù)類型使用上的問題,這種開發(fā)方式目前在許多框架與函數(shù)庫項目,或是以JavaScript應(yīng)用為主的開發(fā)團隊中都已經(jīng)都是必用工具。

注: 本文內(nèi)容大部份參考自Flow官網(wǎng),是之前我個人博客文章 - "Flow靜態(tài)數(shù)據(jù)類型的檢查工具,10分鐘快捷入門"的增修版本。

注: 本文內(nèi)容字數(shù)過萬,去除代碼也有數(shù)千字,筆誤在所難免,有錯再回饋留言吧。

注意

"奇異博士"說過「使用警語應(yīng)該要加注在書的最前面」。所以我把注意項目先加在這里。

由于Flow還是個年輕的項目,問題仍然很多,功能也沒你想像中完整,用起來有時候會卡頓是正常的,效能仍須改善。以后用戶愈來愈多就會愈作愈好。

Windows平臺的支持也是幾個月前(2016.8)時的事,F(xiàn)low只支持64位元的作業(yè)系統(tǒng),32位元就不能用了。

如果你是要學(xué)或用React或Vue.js等等,F(xiàn)low是必學(xué)的。不管你要用不用,庫源碼里面都用了。

Flow介紹

Flow是個JavaScript的靜態(tài)類型檢查工具,由Facebook出品的開源碼項目,問世只有一年多,是個相當(dāng)年輕的項目。簡單來說,它是對比TypeScript語言的解決方式。

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

這個缺點在應(yīng)用規(guī)?;瘯r,會顯得更加嚴重。我們在開發(fā)團隊的協(xié)同時,一般都是用詳盡的文字說明,來降低這個問題的發(fā)生,但JS語言本身無法有效阻止這些問題。而且說明文件也需要花時間額外編寫,其他的開發(fā)者閱讀也需要花時間。在現(xiàn)今預(yù)先編譯器流行的年代,像TypeScript這樣的強(靜態(tài))類的JavaScript超集語言就開始流行,用嚴格的角度,以JavaScript語言為基底,來重新打造另一套具有強(靜態(tài))類型特性的語言,就如同Java或C#這些語言一樣,這也是為什么TypeScript稱自己是企業(yè)級的開發(fā)JavaScript解決方案。

注: 強(靜態(tài))類型語言,意思是可以讓變量或常量在聲明(定義)時,就限制好只能使用哪種類型,之后在使用時如果發(fā)生類型不相符時,就會發(fā)出錯誤警告而不能編譯。但不只這些,語言本身也會拓展了更多的類型與語法。

TypeScript自然有它的市場,但它有一些明顯的問題,首先是JavaScript開發(fā)者需要再進一步學(xué)習(xí),內(nèi)容不少,也有一定陡峭的學(xué)習(xí)曲線,不過這還算小事情。重大的事情是需要把已經(jīng)在使用的應(yīng)用代碼,都要整個改用TypeScript代碼語法,才能發(fā)揮完整的功用。這對很多已經(jīng)有內(nèi)部代碼庫的大型應(yīng)用開發(fā)團隊而言,將會是個重大的決定,因為如果不往全面重構(gòu)的路走,將無法發(fā)揮強(靜態(tài))類型語言的最大效用。

所以許多現(xiàn)行的開源碼函數(shù)庫或框架,并不會直接使用TypeScript作為代碼的語言,另一方面當(dāng)然因為是TypeScript并非普及到一定程度的語言,社群上有熱愛的粉絲也有不是那么支持的反對者。當(dāng)然,TypeScript也有它的優(yōu)勢,自從TypeScript提出了DefinitelyTyped的解決方式之后,讓現(xiàn)有的函數(shù)庫能額外再定義出里面使用的類型,這也是另一個可以與現(xiàn)有框架與庫相整合的方案,這讓許多函數(shù)庫與框架都提交定義檔案,提供了另一種選擇。另一個優(yōu)勢是,TypeScript也是個活躍的開源碼項目,發(fā)展到現(xiàn)在也有一段時間,算是逐漸成熟的項目。它的背后有微軟公司的支持,在最近發(fā)布的知名的、全新打造過的Angular2框架中(由Google主導(dǎo)),也采用了TypeScript作為基礎(chǔ)的開發(fā)語言。

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

相較于TypeScript是另外重新制定一套語言,最后再經(jīng)過編譯為JavaScript代碼來運行。Flow走的則是非強制與非侵入性的路線。Flow的優(yōu)點是易學(xué)易用,它的學(xué)習(xí)曲線沒有TypeScript來得高,雖然內(nèi)容也很多,但大概一天之內(nèi)學(xué)個大概,就可以漸進式地開始使用。而且因為Flow從頭到尾只是個檢查工具,并不是新的程序語言或超集語言,所以它可以與各種現(xiàn)有的JavaScript代碼兼容,如果你哪天不想用了,就去除掉標記就是回到原來的代碼,沒什么負擔(dān)。當(dāng)然,F(xiàn)low的功用可能無法像TypeScript這么全面性,也不可能改變要作某些事情的語法結(jié)構(gòu)。

總結(jié)來說,這兩種方式的目的是有些相似的,各自有優(yōu)點也有不足之處,青菜蘿卜各有所愛,要選擇哪一種方式就看你的選擇。

從一個小例子演示

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

function foo(x) {
  return x + 10
}

foo("Hello!")

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

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

function foo(number) {
  return number + 10
}

但如果在復(fù)合類型的情況,例如這個傳參的類型可以是數(shù)字類型也可以是布爾類型,你又要如何寫得清楚?更不用說如果是個復(fù)雜的對象類型時,結(jié)構(gòu)又該如何先確定好?另外還有函數(shù)的返回類型又該如何來寫?

利用Flow類型的定義方式,來解決這個小案例的問題,可以改寫為像下面的代碼:

// @flow

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

foo("hi")

你有看到在函數(shù)的傳參,以及函數(shù)的圓括號(())后面的兩個地方,加了: number標記,這代表這個傳參會限定為數(shù)字類型,而返回值也只允許是數(shù)字類型。

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

message: "[flow] string (This type is incompatible with number See also: function call)"

這消息是說,你這函數(shù)的傳參是string(字符串)類型,與你聲明的number(數(shù)字)不相符合。

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

// @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)  // 這一行有類型錯誤消息

由上面這個小例子你可以想見,如果在多人協(xié)同開發(fā)某個有規(guī)模的JavaScript應(yīng)用時,這種類型的輸出輸入問題就會很常遇見。如果利用Flow工具的檢查,可以避免掉許多不必要的類型問題。

真實案例

可能你會認為Flow工具只能運用在小型代碼中,但實際上Facebook會創(chuàng)造出Flow工具,有很大的原因是為了React與React Native。

舉一個我最近正在研究的的函數(shù)庫代碼中NavigationExperimental(這網(wǎng)址位置有可能會變,因為是直接連到源碼里),這里面就預(yù)先聲明了所有的對象結(jié)構(gòu),像下面這樣的代碼:

export type NavigationGestureDirection = "horizontal" | "vertical";

export type NavigationRoute = {
  key: string,
  title?: string
};

export type NavigationState = {
  index: number,
  routes: Array,
};

// ...

Flow具備有像TypeScript語言中,預(yù)先定義對象類型的作用。上面代碼的都是這個組件中預(yù)先定義的類型,這些類型可以再套用到不同的代碼文檔之中。

export type NavigationGestureDirection = "horizontal" | "vertical";

上面這行類似于列舉(enum)的類型,意思是說要不就是"horizontal"(水平的),要不然就"vertical"(垂直的),就這兩種字符串值可使用。

export type NavigationRoute = {
  key: string,
  title?: string
};

這行里面用了一個問號(?)定義在title屬性的后面,這代表這屬性是可選的(Optional),不過你可能會有點搞混,因為問號(?)可以放在兩個位置,見下面的例子:

export type Test = {
  titleOne?: string,
  titleTwo: ?string
}

titleOne代表的是屬性為可自定義的(可有可無),但一定是字符串類型。titleTwo代表的是類型可自定義,也就是值的部份除了定義的類型,也可以是null或undefined,不過這屬性是需要的,而且你一定要給它一個值。好的,這有些太細部了,如果有用到再查手冊文檔就可以。

export type NavigationState = {
  index: number,
  routes: Array,
};

上面的代碼可以看到,只要是聲明過的類型(type),同樣可以拿來拿在其他類型中套用,像這里的Array,就是使用了上面已聲明的NavigationRoute類型。它是一個數(shù)組,里面放的成員是NavigationRoute類型,是個對象的結(jié)構(gòu)。

剛已經(jīng)有說過Flow工具有很大的原因是為了React與React Native所設(shè)計,因為Flow本身就內(nèi)建對PropTypes的檢查功能,也可以正確檢查JSX語法,在這篇官方文檔中有說明,而這在之后介紹React的文檔的例子中就可以看到。

安裝與使用

Flow目前可以支持macOS、Linux(64位元)、Windows(64位元),你可以從以下的四種安裝方式選擇其中一種:

直接從Flow的發(fā)布頁面下載可運行檔案,加到計算機中的PATH(路徑),讓flow指令可以在命令列窗口訪問即可。

透過npm安裝即可,可以安裝在全局(global)或是各別項目中。下面為安裝在項目中的指令:

npm install --save-dev flow-bin

macOS中可以使用homebrew安裝:

brew update
brew install flow

透過OCaml OPAM套裝管理程序打包與安裝,請見Flow的Github頁面。

Flow簡單使用三步驟 第1步: 初始化項目

在你的項目根目錄的用命令列工具輸入下面的指令,這將會創(chuàng)建一個.flowconfig文檔,如果這文檔已經(jīng)存在就不需要再進行初始化,這個設(shè)置檔一樣是可以加入自定義的設(shè)置值,請參考Advanced Configuration這里的說明,目前有很多項目里面都已經(jīng)內(nèi)附這個設(shè)置檔,例如一些React的項目:

flow init
第2步: 在代碼文檔中加入要作類型檢查的注釋

一般都在代碼檔案的最上面一行加入,沒加Flow工具是不會進行檢查的,有兩種格式都可以:

// @flow

/* @flow */
第3步: 進行檢查

目前支持Flow工具插件的代碼編輯工具很多,常見的Atom, Visual Studio Code(VSC), Sublime與WebStorm都有,當(dāng)有安裝搭配代碼編輯工具的插件時,編輯工具會輔助顯示檢查的訊息。不過有時候會有點卡頓的要等一下,因為檢查速度還不是那么快。

或是直接用下面的命令列指令來進行檢查:

flow check

在Visual Studio Code中因為它內(nèi)建TypeScript與JavaScript的檢查功能,如果要使用Flow工具來作類型檢查,需要在用戶設(shè)置中,加上下面這行設(shè)置值以免沖突:

"javascript.validate.enable": false
轉(zhuǎn)換(編譯)有Flow標記的代碼

注: 有些腳手架就已經(jīng)裝好與設(shè)置好這個babel拓展插件,你不用再多安裝了。

在開發(fā)的最后階段要將原本有使用Flow標記,或是有類型注釋的代碼,進行清除或轉(zhuǎn)換。轉(zhuǎn)換的工作要使用babel編譯器,這也是目前較推薦的方式。

使用babel編譯器如果以命令列工具為主,可以使用下面的指令來安裝在全局中:

npm install -g babel-cli

再來加裝額外移除Flow標記的npm套件babel-plugin-transform-flow-strip-types在你的項目中:

npm install --save-dev babel-plugin-transform-flow-strip-types

然后創(chuàng)建一個.babelrc設(shè)置檔案,檔案內(nèi)容如下:

{
  "plugins": [
    "transform-flow-strip-types"
  ]
}

完成設(shè)置后,之后babel在編譯時就會一并轉(zhuǎn)換Flow標記。

下面的指令則是直接把src目錄的檔案編譯到dist目錄中:

babel src -d dist

當(dāng)然,babel的使用方式不是只有上面說的這種命令列指令,你可以視項目的使用情況來進行設(shè)置。

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

Flow用起來是的確是簡單,但里面的內(nèi)容很多,主要原因是是要看實際不同的使用情況作搭配。JavaScript里面的原始數(shù)據(jù)類型都有支持,而在函數(shù)、對象與一些新的ES6中的類,在搭配使用時就會比較復(fù)雜,詳細的情況就請到官網(wǎng)文檔中觀看,以下只能提供一些簡單的介紹說明。

原始數(shù)據(jù)類型

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

boolean

number

string

null

void

其中的void類型,它就是JS中的undefined類型。

這里可能要注意的是,在JS中undefinednull的值會相等但類型不同,意思是作值相等比較時,像(undefined == null)時會為true,有時候在一些運行期間的檢查時,可能會用值相等比較而不是嚴格的相等比較,來檢查這兩個類型的值。

所有的類型都可以使用垂直線符號(|)作為聯(lián)合使用(也就是 OR 的意思),例如string | number指的是兩種類型其中一種都可使用,這是一種聯(lián)合的類型,稱為"聯(lián)合(Union)類型"。

最特別的是可選的(Optional)類型的設(shè)計,可選類型代表這個變量或常量的值有可能不存在,也就是允許它除了是某個類型的值外,也可以是nullundefined值。要使用可選類型,就是在類型名稱定義前加上問號(?),例如?string這樣,下面是一個簡單的例子:

let bar: ?string = null
字面文字(literal)類型

字面文字類型指的是以真實值作為數(shù)據(jù)類型,可用的值有三種,即數(shù)字、字符串或布爾值。字面文字類型搭配聯(lián)合的類型可以作為列舉(enums)來使用,例如以下的一個撲克牌的類型例子:

type Suit =
  | "Diamonds"
  | "Clubs"
  | "Hearts"
  | "Spades";

type Rank =
  | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
  | "Jack"
  | "Queen"
  | "King"
  | "Ace";

type Card = {
  suit: Suit,
  rank: Rank,
}

注: type是Flow中定義類型別名(Type Alias)的關(guān)鍵字,是一種預(yù)先聲明的類型,這些聲明的標記一樣只會在開發(fā)階段中使用,最后編譯去除。

類型別名

類型別名(Type Alias)提供了可以預(yù)先定義與集中代碼中所需要的類型,一個簡單的例子如下:

type T = Array
var x: T = []
x["Hi"] = 2 //有Flow警告

類型別名(Type Alias)也可以用于復(fù)雜的應(yīng)用情況,詳見Flow官網(wǎng)提供的Type Aliases內(nèi)容。

任何的數(shù)據(jù)類型

在某一些情況可能不需要定義的太過于嚴格,或是還在開發(fā)中正在調(diào)試時,有一種作為漸進的改善代碼的類型。

Flow提供了兩種特殊的類型可以作為松散的數(shù)據(jù)類型定義:

any: 相當(dāng)于不檢查。既是所有類型的超集(supertype),也是所有類型的子集(subtype)

mixed: 類似于any是所有類型的超集(supertype),但不同于any的是,它不是所有類型的子集(subtype)

mixed是一個特別的類型,中文是混合的意思,mixed算是any的"啰嗦"進化類型。mixed用在函數(shù)的輸入(傳參)與輸出(返回)時,會有不一樣的狀態(tài),例如以下的例子會出現(xiàn)警告:

function foo(x: mixed): string {
  return x + "10"
}

foo("Hello!")
foo(1)

會出現(xiàn)警告消息如下:

[flow] mixed (Cannot be added to string)

這原因是雖然輸入時可以用mixed,但Flow會認為函數(shù)中x的值不見得可以與string類型作相加,所以會請求你要在函數(shù)中的代碼,要加入檢查對傳入類型在運行期間的類型檢查代碼,例如像下面修改過才能過關(guān):

function foo(x: mixed): string {
  if (typeof x === "number" || typeof x === "string") {
    return x + "10"
  }
  throw new Error("Invalid x type")
}

foo("Hello!")
foo(1)

mixed雖然"啰嗦",但它是用來漸進替換any使用的,有時候往往開發(fā)者健忘或偷懶沒作傳入值在運行期間的類型檢查,結(jié)果后面要花更多的時間才能找出錯誤點,這個類型的設(shè)計大概是為了提早預(yù)防這樣的情況。

注: 從上面的例子可以看到Flow除了對類型會作檢查外,它也會請求對某些類型需要有動態(tài)的檢查。在官方的文件可以參考Dynamic Type Tests這個章節(jié)。

復(fù)合式的數(shù)據(jù)類型 數(shù)組(Array)

數(shù)組類型使用的是Array,例如Array,會限定數(shù)組中的值只能使用數(shù)字的數(shù)據(jù)類型。當(dāng)然你也可以加入埀直線(|)來定義允許多種類型,例如Array

對象(Object)

對象類型會比較麻煩,主要原因是在JavaScript中所有的數(shù)據(jù)類型大概都可以算是對象,就算是基礎(chǔ)數(shù)據(jù)類型也有對應(yīng)的包裝對象,再加上有個異常的null類型的typeof返回值也是對象。

對象類型在Flow中的使用,基本上要分作兩大部份來說明。

第一種是單指Object這個類型,F(xiàn)low會判斷所有的基礎(chǔ)數(shù)據(jù)類不是屬于這個類型的,以下的例子全部都會有警告:

// 以下都有Flow警告

(0: Object);
("": Object);
(true: Object);
(null: Object);
(undefined: Object);

其他的復(fù)合式數(shù)據(jù)類型,除了數(shù)組之外,都會認為是對象類型。如下面的例子:

({foo: "foo"}: Object);
(function() {}: Object);
(class {}: Object);
([]: Object); // Flow不認為數(shù)組是屬于對象

注意: 上面有兩個特例,typeof nulltypeof []都是返回"object"。也就是說在JS的標準定義中,null數(shù)組用typeof檢測都會返回對象類型。所以,F(xiàn)low工具的檢查會與JS預(yù)設(shè)并不相同,這一點要注意。

注: typeof在Flow中有一些另外的用途,詳見Typeof的說明。

第二種方式是要定義出完整的對象的字面文字結(jié)構(gòu),像{ x1: T1; x2: T2; x3: T3;}的語法,用這個結(jié)構(gòu)來檢查,以下為例子:

let object: {foo: string, bar: number} = {foo: "foo", bar: 0};

object.foo = 111; //Flow警告
object.bar = "111"; //Flow警告
函數(shù)(Function)

上面已經(jīng)有看到,函數(shù)也屬于對象(Object)類型,當(dāng)然也有自己的Function類型,函數(shù)的類型也可以從兩大部份來看。

第一是單指Function這個類型,可以用來定義變量或常量的類型。如下面的代碼例子:

var anyFunction: Function = () => {};

第二指的是函數(shù)中的用法,上面已經(jīng)有看到函數(shù)的輸出(返回值)與輸入(傳參)的用法例子。例如以下的例子:

function foo(x: number): number {
  return x + 10;
}

因為函數(shù)有很多種不同的使用情況,實際上可能會復(fù)雜很多,F(xiàn)low工具可以支持目前最新的arrow functions、async functions與generator functions,詳見官方的這篇Functions的說明。

類(Class)

類是ES6(ES2015)中新式的特性,類目前仍然只是原型的語法糖,類本身也屬于一種對象(Object)類型。類的使用情況也可能會復(fù)雜,尤其是涉及多型與實例的情況,詳見Flow網(wǎng)站提供的Classes內(nèi)容。

Flow的現(xiàn)在與未來的發(fā)展

Flow在最近的博客中說明引入了flow-typed的函數(shù)庫定義檔("libdefs"),在這個Github存儲庫中將統(tǒng)一存放所有來自社群提供的函數(shù)庫定義檔案。這是一種可以讓現(xiàn)有的函數(shù)庫與框架,預(yù)先寫出里面使用的類型定義。讓項目里面有使用Flow工具與這些函數(shù)庫,就可以直接使用這些定義檔,以此結(jié)合現(xiàn)有的函數(shù)庫與框架來使用。這個作法是參考TypeScript的DefinitelyTyped方式。因為這還是很新的消息(2016.10),目前加入的函數(shù)庫還沒有太多,不過React周邊的一些函數(shù)庫或組件都已經(jīng)開始加入,其他常用的像underscore、backbone或lodash也已經(jīng)有人在提交或維護。

Flow另一個發(fā)展會是在開發(fā)工具的自動完成功能的改進,因為如果已經(jīng)能在撰寫代碼時,就知道變量或常量的類型(靜態(tài)類型),那么在自動完成功能中就可以更準確地給出可用的屬性或方法。這一個功能在Facebook自家的Nuclide開發(fā)工具的Flow說明頁中就有看到。Nuclide是基于Atom開發(fā)工具之上的工具,計算機硬件如果不夠力是跑不動的,而且它穩(wěn)定性與運行速度都還需要再努力。這大概是未來可見到的一些新趨向。

結(jié)論

本文簡單的說明了Flow工具的功能介紹,以及其中的一些簡要的內(nèi)容等等。相信看過后你已經(jīng)對這個Flow工具有一些認識,以我個人學(xué)過TypeScript的經(jīng)驗,相較于TypeScript的學(xué)習(xí)曲線,F(xiàn)low大概是等于不用學(xué)。Flow雖然是一個很新的工具,但相當(dāng)?shù)挠杏茫ㄗh每個JavaScript開發(fā)者都可以試試,一開始不用學(xué)太多,大概這篇文檔看完就可以開始用了。復(fù)雜的地方就再查找官方的文件即可。

對于每個正在使用JS開發(fā)稍具規(guī)?;膽?yīng)用,或是開發(fā)開源碼的函數(shù)庫或框架的團隊來說,讓JS具有靜態(tài)類型特性,是一個很重要而且必要的決定。以我的觀察,在網(wǎng)絡(luò)上一直有很多的超集語言(例如TypeScript)的愛好者,會提出要全面改用TypeScript(或其他超集語言)的聲音,例如Vue.js在很早之前就有討論是不是要全面采用TypeScript的聲音。后來Vue.js只有提交TypeScript的DefinitelyTyped文檔,但在2.0中則采行了Flow工具。在這篇Vue作者于知乎上發(fā)表的: Vue 2.0 為什么選用 Flow 進行靜態(tài)代碼檢查而不是直接使用 TypeScript?的內(nèi)容中,你可以看到為何選擇Flow的理由,這可能也是整個開發(fā)團隊所認同的最后結(jié)果。作者回答的文中可以總結(jié)下面這句話:

全部換 TS(TypeScript) 成本過高,短期內(nèi)并不現(xiàn)實。 相比之下 Flow 對于已有的 ES2015 代碼的遷入/遷出成本都非常低 … 萬一哪天不想用 Flow 了,轉(zhuǎn)一下,就得到符合規(guī)范的 ES。

總之,F(xiàn)low提供了另一個選擇,要用什么工具就看聰明的你如何選擇了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/81171.html

相關(guān)文章

  • JS 靜態(tài)類型檢查工具 Flow

    摘要:本文主要介紹了解決作為弱類型語言沒有類型檢查痛點的靜態(tài)類型檢查工具,并且介紹了在中使用的方法,最后介紹了一些常用的語法。 本文主要介紹了解決JS作為弱類型語言沒有類型檢查痛點的靜態(tài)類型檢查工具 Flow ,并且介紹了在WebStorm中使用Flow的方法,最后介紹了一些常用的Flow語法。 1. 簡介 JS作為一種腳本語言是沒有類型檢測的,這個特點有時候用著很方便,但在一個較大的項目中...

    CloudDeveloper 評論0 收藏0
  • 前端進階(5) - js 擴展:靜態(tài)類型檢查(facebook flow

    摘要:擴展靜態(tài)類型檢查語言與系列等語言有一點很大的不同,就是語言是弱類型語言。但其實很多開發(fā)人員還是比較喜歡用來開發(fā)項目,所以開發(fā)出來幫助語言擴展靜態(tài)類型檢查功能,規(guī)避上面提到的問題。 js 擴展:靜態(tài)類型檢查(facebook flow) js 語言與 java、C 系列等語言有一點很大的不同,就是 js 語言是弱類型語言。js 語言的這個特性可能讓大家覺得 js 很自由,沒有強制性的約束...

    孫淑建 評論0 收藏0
  • JavaScript類型檢查Flow

    摘要:一是一種弱類型動態(tài)類型檢查的語言。動態(tài)類型與靜態(tài)類型的核心區(qū)別動態(tài)類型的類型檢查是是在代碼運行的時候進行的,靜態(tài)類型的類型檢查則是在編譯時進行。 一、js是一種弱類型、動態(tài)類型檢查的語言。 弱類型:在定義變量時,可以為變量定義復(fù)制任何數(shù)據(jù),變量的數(shù)據(jù)類型不是固定死的,這樣的類型叫做弱類型。 var a = 10; a = abc; a = []; a = function() {}...

    zhonghanwen 評論0 收藏0
  • Flow, 一個新的Javascript靜態(tài)類型檢查

    摘要:原文鏈接翻譯于今天我們興奮的發(fā)布了的嘗鮮版,一個新的靜態(tài)類型檢查器。為添加了靜態(tài)類型檢查,以提高開發(fā)效率和代碼質(zhì)量。這最終形成一個高度并行增量式的檢查架構(gòu),類似。知道縮小類型范圍時做動態(tài)檢查的影響。 原文鏈接:https://code.facebook.com/posts/1505962329687926/flow-a-new-static-type-checker-for-java...

    liangzai_cool 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<