2017-07-17 57 views
0

據說我有以下類型的對象屬性名稱:流類型:獲取基於流量類型

declare interface SomeClass { 
    x?: ?number; 
    y?: ?string; 
} 

現在我將此類型的對象SomeObject,這將來自後端調用來獲取。問題是,有時返回的值將是這樣的:

{ "x": 1, "y": "Some String", "z": "Additional Payload" } 

的問題是:我怎麼能使用流刪除這些所謂的附加載荷?或者這是不可能的?

+0

爲什麼在'x'和'y'鍵中使用'?'?如果'z'鍵有時可能出現,使用'?'符號。 –

+0

好吧,需要刪除鍵'z'。有時候會有更多的附加鍵,例如'z1','z2'等。我想要的是一個乾淨的對象,只包含'x'和'y'。這可以使用Flow完成,還是應該嘗試其他方法? –

+0

我想你將不得不從對象中選擇所需的鍵。流程沒有這些功能。 –

回答

0

Flow是靜態描述JavaScript代碼的類型級語言。它沒有運行時效果,並且不會更改代碼的含義 - 如果從正確類型的程序中刪除Flow註釋,則它將運行完全相同。這是Flow的設計目標之一,它將其與TypeScript等語言區分開來。

考慮到這一點,Flow很明顯無法幫助您改變對象的結構。但是,如果您分配一個對象,只有特定的字段類型,流程可以幫助確保你不使用你不應該字段:

type MyType = { 
    x?: ?number, 
    y?: ?string 
} 
let foo: MyType = { "x": 1, "y": "Some String", "z": "Additional Payload" }; 

foo.z; // ERROR! Even though z is there, it's not part of MyType 

但是,假設你希望它是較早時更嚴格,並且不允許任務中有任何其他屬性。您可以使用{| .. |}表示沒有其他領域被允許:

type MyType = {| 
    x?: ?number, 
    y?: ?string 
|} 
let foo: MyType = { "x": 1, "y": "Some String", "z": "Additional" }; // ERROR! 

請注意,您仍然需要檢查數據,因爲它到達,如果它是從外部來源。流程只能使用編譯時信息。

1

不,你不能用流量去除那個額外的有效載荷。由於流只是一個靜態類型檢查器,並且所有流程語句都將爲您運行的JavaScript文件刪除。但是您可以使用類似的東西來刪除剩餘的有效負載:

const { x, y } = object; 
object = { x, y };