跳到主要內容

版本 0.14.0

我們注意到,並非所有人都會強迫性地查看 GitHub 以取得 Flow 的版本。這讓我們感到驚訝,但我們也希望支援這些使用者。因此,我們將從這個版本開始,在部落格上宣布每個 Flow 版本。

以下是 Flow v0.14.0!請查看變更日誌,取得已變更內容的正規清單。

宣布不相交聯集

有時,程式需要同時處理不同種類的資料,而資料的形狀會根據程式碼正在查看的資料種類而有所不同。這種程式設計在函數式程式語言中非常常見,因此幾乎所有此類語言都附有

  • 透過「標籤」區分不相交案例來指定此類資料,其中每個標籤都與不同的屬性「記錄」關聯。(這些說明稱為「不相交聯集」或「變異」類型。)
  • 透過檢查標籤,然後直接存取關聯的屬性記錄,對此類資料進行案例分析。(進行此類案例分析的常見方式是模式配對。)

分析或轉換此類資料的程式範例包括使用抽象語法樹的編譯器,以及可能會傳回例外值的操作,還有更多介於兩者之間的範例!

從 Flow 0.13.1 開始,現在可以在 JavaScript 中以類型安全的方式使用這種樣式進行程式設計。您可以定義物件類型的不相交聯集,並透過切換這些物件類型中某些共用屬性(稱為「哨兵」)的值,對該類型的物件進行案例分析。

Flow 的不相交聯集語法如下

type BinaryTree =
{ kind: "leaf", value: number } |
{ kind: "branch", left: BinaryTree, right: BinaryTree }

function sumLeaves(tree: BinaryTree): number {
if (tree.kind === "leaf") {
return tree.value;
} else {
return sumLeaves(tree.left) + sumLeaves(tree.right);
}
}

宣布有界多型

從 Flow 0.5.0 開始,您可以定義多型函式和類別,其類型參數有界限。這對於撰寫需要對其類型參數進行一些約束的函式和類別非常有用。Flow 的有界多型語法如下

class BagOfBones<T: Bone> { ... }
function eat<T: Food>(meal: T): Indigestion<T> { ... }

問題

考慮在 Flow 中定義多型函式的以下程式碼

function fooBad<T>(obj: T): T {
console.log(Math.abs(obj.x));
return obj;
}

此程式碼不會(也不應該!)類型檢查。並非所有值 obj: T 都具有屬性 x,更不用說屬性 xnumber,這是 Math.abs() 強加的額外要求。

宣布 Flow 註解

從 Flow 0.4.0 開始,您可以將 Flow 特定的語法放入特殊註解中。如果您使用這些特殊註解,則無需在執行程式碼之前轉換 Flow 特定的語法。雖然我們強烈建議您在沒有特殊註解的情況下撰寫程式碼,但此功能將有助於無法將 Flow 剝離轉換納入其設定的人員。這是我們最受要求的功能之一,希望它能讓更多人使用 Flow!

此功能引入了 3 個特殊註解:/*:/*::/*flow-include。Flow 將讀取這些特殊註解中的程式碼,並將程式碼視為特殊註解令牌不存在。這些特殊註解是有效的 JavaScript 程式區塊註解,因此您的 JavaScript 引擎將忽略註解中的程式碼。

宣布匯入類型

從 Flow 0.3.0 開始,現在可以從另一個模組匯入類型。因此,例如,如果您僅匯入類別以在類型註解中參照它,現在可以使用新的 import type 語法來執行此操作。

動機

這是否曾經發生在您身上

// @flow

// Post-transformation lint error: Unused variable 'URI'
import URI from "URI";

// But if you delete the require you get a Flow error:
// identifier URI - Unknown global name
module.exports = function(x: URI): URI {
return x;
}

現在您有出路了!為了解決此問題(並著眼於 ES6 模組語法即將到來的未來),我們新增了 import type 語法。使用 import type,您可以傳達您在此處的真正意思,即您想要匯入類別的類型,而不是類別本身。

宣布類型轉換

從版本 0.3.0 開始,Flow 支援類型轉換表達式。

類型轉換表達式是一種為任何 JavaScript 表達式加上類型註解的簡單方式。以下是類型轉換的一些範例

(1 + 1 : number);
var a = { name: (null: ?string) };
([1, 'a', true]: Array<mixed>).map(fn);

對於任何 JavaScript 表達式 <expr> 和任何 Flow 類型 <type>,你可以寫

(<expr> : <type>)

注意:括號是必要的。