摘要:擴展靜態類型檢查語言與系列等語言有一點很大的不同,就是語言是弱類型語言。但其實很多開發人員還是比較喜歡用來開發項目,所以開發出來幫助語言擴展靜態類型檢查功能,規避上面提到的問題。
js 擴展:靜態類型檢查(facebook flow)
js 語言與 java、C 系列等語言有一點很大的不同,就是 js 語言是弱類型語言。js 語言的這個特性可能讓大家覺得 js 很自由,沒有強制性的約束,但是當遇到大型項目的時候,js 的這個特性就會變得比較麻煩,因為這會導致團隊的代碼很不可控。這個原因也是促使 TypeScript 誕生的一個很重要的原因。
但其實很多開發人員還是比較喜歡用 js 來開發項目,所以 facebook 開發出 flow 來幫助 js 語言擴展靜態類型檢查功能,規避上面提到的問題。
1. 代碼示例flow 規定,在需要做 "flow 靜態類型檢查" 文件的開頭加上 // @flow 這段注釋,讓工具識別這個文件需要做靜態類型檢查,否則就會當作一般 js 文件對待,不做靜態類型檢查。
flow 靜態類型幾乎可以應用到所有的 js 對象,包括 es6 擴展的 class, module 等,也包括 jsx 語法。
以下是一些基礎的靜態類型舉例,更詳細的可以查看 Type Annotations | Flow.
1.1 基本類型與 js 的基本數據類型類似,包括:
boolean: 對應 js 的 Boolean 類型
number: 對應 js 的 Number 類型
string: 對應 js 的 String 類型
null: 對應 js 的 null
void: 對應 js 的 undefined
正常的 js 代碼
let hello = "hello"; // 聲明一個變量 hello = 2 * 2; // 重新賦值 hello = []; // 重新賦值
加上 flow 靜態類型檢查擴展的代碼
// @flow let hello: string = "hello"; // 聲明一個 string 類型的變量 hello = 2 * 2; // 報錯 hello = []; // 報錯 hello = "hi"; // 重新賦值1.2 函數
正常的 js 代碼
function plus(a, b) { return a + b; } plus(); // NaN plus(1); // NaN plus(1, 2); // 3 plus("hello"); // "helloundefined" plus("hello", " hi"); // "hello hi" plus({}, {}); // "[object Object][object Object]"
加上 flow 靜態類型檢查擴展的代碼
// @flow // 定義一個 "兩個數字參數,返回值也是數字" 的函數 function plus(a: number, b: number): number { return a + b; } plus(); // 報錯 plus(1); // 報錯 plus("hello"); // 報錯 plus("hello", " hi"); // 報錯 plus({}, {}); // 報錯 plus(1, 2); // 31.3 可能(Maybe),可選(Optional),語義(Literal),混合(Mixed)
可能(Maybe)類型用一個 ? 在類型前面表示,包含類型本身、null、undefined
// @flow let hello: ?string; // 聲明一個數據類型可以是 string, null, undefined 的變量 hello = null; // 賦值 hello = undefined; // 重新賦值 hello = "hello"; // 重新賦值 hello = 1; // 報錯 hello = true; // 報錯
可選(Optional)類型一般用于對象屬性或者函數參數,在名稱后面加一個 ?,包含類型本身、undefined
// @flow const obj: {hello? : string}; // 屬性 hello 可以是 string, undefined obj = {}; // 賦值 obj = {hello: undefined}; // 重新賦值 obj = {hello: "hello"}; // 重新賦值 obj = {hello: null}; // 報錯 obj = {hello: 1}; // 報錯 obj = {hello: true}; // 報錯 // 屬性 param 可以是 number, undefined function method(param?: number) { /* ... */ } method(); // 正常 method(undefined); // 正常 method(1.12); // 正常 method(null); // 報錯 method("hello"); // 報錯
語義(Literal)類型一般用于聲明某個,某幾個特定的值(多個值用 | 分隔)
// @flow let hello: "hello"; // 聲明一個只能賦值 "hello" 的變量 hello = "hello"; // 賦值 hello = "hi"; // 報錯 hello = 12; // 報錯 hello = undefined; // 報錯 hello = null; // 報錯 function method(param: 1 | "hi" | boolean): void { /* ... */ } method(); // 報錯,缺少參數 method(1); // ok method(1.2); // 報錯,類型不對 method("hi"); // ok method("hello"); // 報錯,類型不對 method(true); // ok method(false); // ok
混合(Mixed)類型是指任意數據類型
// @flow let hello: mixed; // 聲明一個 mixed 類型的變量 hello = "hello"; // 賦值 hello = "hi"; // 重新賦值 hello = 12; // 重新賦值 hello = undefined; // 重新賦值 hello = null; // 重新賦值1.4 復合類型
數組
// @flow let arr1: Array= [true, false, true]; // 聲明一個元素是 boolean 的數組 arr1 = [true, 1]; // 報錯,1 不是 boolean 值 arr1 = [""]; // 報錯,"" 不是 boolean 值 let arr2: Array = ["A", "B", "C"]; // 聲明一個元素是 string 的數組 let arr3: Array = [1, true, "three"] // 聲明一個元素是任意類型的數組 arr1 = [true, 1]; // 重新賦值 arr1 = [""]; // 重新賦值
map
// @flow // 聲明一個 map 類型,其有一個名為 foo,類型 boolean 的子元素 let obj1: { foo: boolean } = { foo: true }; obj1 = {}; // 報錯,缺少 foo 這個屬性值 obj1 = {foo: 1}; // 報錯,屬性值 foo 的類型必須是 boolean obj1 = {foo: false, bar: "hello"}; // 重新賦值 // 聲明一個 map 類型,其有名為 foo, bar, baz,類型 number, boolean, string 的子元素 let obj2: { foo: number, bar: boolean, baz: string, } = { foo: 1, bar: true, baz: "three", };
更靜態類型可以查看 Type Annotations | Flow.
2. 使用工具安裝
# 全局安裝 npm i -g flow-bin # 本地安裝 npm i -D flow-bin
使用
flow init # 初始化項目 flow check path/to/dir # 檢查這個目錄下所有的文件 flow check path/to/js/file # 檢查指定文件3. 配合 babel 一起使用
因為 flow 靜態類型只是對 js 的擴展,并不是 js 原生支持的,也不能直接運行,所以,一般 flow 都是配合 babel 一起使用的,這樣就可以在程序運行的時候進行靜態類型檢查,達到我們想要的效果。
3.1 babel-preset-flow安裝 babel-preset-flow,這樣 babel 在轉碼 js 文件時就能識別 flow 的語法。
npm i -D babel-preset-flow
.babelrc
{ "presets": ["flow"] }
源文件(flow)
// @flow // 定義一個 "兩個數字參數,返回值也是數字" 的函數 function plus(a: number, b: number): number { return a + b; } plus(); // 報錯 plus(1); // 報錯 plus("hello"); // 報錯 plus("hello", " hi"); // 報錯 plus({}, {}); // 報錯 plus(1, 2); // 3
轉碼后的文件
// 定義一個 "兩個數字參數,返回值也是數字" 的函數 function plus(a, b) { return a + b; } plus(); // 報錯 plus(1); // 報錯 plus("hello"); // 報錯 plus("hello", " hi"); // 報錯 plus({}, {}); // 報錯 plus(1, 2); // 33.2 babel-plugin-flow-runtime
一般會在開發環境下,使用 babel-plugin-flow-runtime 插件,這樣就可以在開發的時候,實時檢查數據類型,就像原生的運行 flow 靜態類型檢查一樣。(一般在產品環境不會使用這個功能,因為會額外消耗 js 的性能)
npm i -D babel-plugin-flow-runtime flow-runtime
.babelrc
{ "presets": ["flow"], "plugins": ["flow-runtime"] }
源文件(flow)
// @flow // 定義一個 "兩個數字參數,返回值也是數字" 的函數 function plus(a: number, b: number): number { return a + b; } plus(); // 報錯 plus(1); // 報錯 plus("hello"); // 報錯 plus("hello", " hi"); // 報錯 plus({}, {}); // 報錯 plus(1, 2); // 3
轉碼后的文件
import t from "flow-runtime"; // 定義一個 "兩個數字參數,返回值也是數字" 的函數 function plus(a, b) { return a + b; } t.annotate(plus, t.function(t.param("a", t.number()), t.param("b", t.number()), t.return(t.number()))); plus(); // 報錯 plus(1); // 報錯 plus("hello"); // 報錯 plus("hello", " hi"); // 報錯 plus({}, {}); // 報錯 plus(1, 2); // 3
這個時候,js 文件就會導入 flow-runtime 模塊,對 plus 函數的參數 a, b 和返回值進行數據類型檢查,如果不符合數據定義,就會報錯。
4. 后續更多博客,查看 https://github.com/senntyou/blogs
作者:深予之 (@senntyou)
版權聲明:自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/96960.html
摘要:原文鏈接翻譯于今天我們興奮的發布了的嘗鮮版,一個新的靜態類型檢查器。為添加了靜態類型檢查,以提高開發效率和代碼質量。這最終形成一個高度并行增量式的檢查架構,類似。知道縮小類型范圍時做動態檢查的影響。 原文鏈接:https://code.facebook.com/posts/1505962329687926/flow-a-new-static-type-checker-for-java...
摘要:本文主要介紹了解決作為弱類型語言沒有類型檢查痛點的靜態類型檢查工具,并且介紹了在中使用的方法,最后介紹了一些常用的語法。 本文主要介紹了解決JS作為弱類型語言沒有類型檢查痛點的靜態類型檢查工具 Flow ,并且介紹了在WebStorm中使用Flow的方法,最后介紹了一些常用的Flow語法。 1. 簡介 JS作為一種腳本語言是沒有類型檢測的,這個特點有時候用著很方便,但在一個較大的項目中...
摘要:系列引言最近準備培訓新人為了方便新人較快入手開發并編寫高質量的組件代碼我根據自己的實踐經驗對組件設計的相關實踐和規范整理了一些文檔將部分章節分享了出來由于經驗有限文章可能會有某些錯誤希望大家指出互相交流由于篇幅太長所以拆分為幾篇文章主要有以 系列引言 最近準備培訓新人, 為了方便新人較快入手 React 開發并編寫高質量的組件代碼, 我根據自己的實踐經驗對React 組件設計的相關實踐...
摘要:在年成為最大贏家,贏得了實現的風暴之戰。和他的競爭者位列第二沒有前端開發者可以忽視和它的生態系統。他的殺手級特性是探測功能,通過檢查任何用戶的功能,以直觀的方式讓開發人員檢查所有端點。 2016 JavaScript 后起之秀 本文轉載自:眾成翻譯譯者:zxhycxq鏈接:http://www.zcfy.cc/article/2410原文:https://risingstars2016...
摘要:資源官網安裝參考什么是是一個弱類型的解釋性語言,無法在編譯環節進行靜態類型校驗,如果想也具備靜態類型檢查功能。那就得使用到由推出,官網是。 資源 官網:https://flow.org/ 安裝:https://flow.org/en/docs/inst... 參考:https://www.01hai.com/note/av... https://www.jianshu.com/p...
閱讀 1990·2021-11-22 19:20
閱讀 2633·2021-11-22 13:54
閱讀 1962·2021-09-04 16:40
閱讀 1823·2021-08-13 11:54
閱讀 2657·2019-08-30 15:55
閱讀 3465·2019-08-29 13:51
閱讀 528·2019-08-29 11:09
閱讀 3008·2019-08-26 14:06