2016-06-21 38 views
13

例如,給出以下記錄:是否有可能將流類型包裝在不可變容器中?

type UserRecord = { 
    id: string; 
    name: ?string; 
    age: number; 
} 

有一些方法做以下等效:

/* @flow */ 

import { List, Map } from 'immutable' 

const users: List<Map<UserRecord>> = List();  
let user: Map<UserRecord>; 

user = Map({ id: '666', age: 30 }); 
users.push(user); 

否則我最終只是使用類似Map<string, any>我想帶走從使用Immutable.js和Flow類型系統。

+0

請注意,有一個WIP immutable.js流接口,您需要手動將其包含到您的項目中。我不知道它是否運作良好,或者根本不知道。請參閱https://github.com/facebook/immutable-js/blob/master/type-definitions/immutable.js.flow和https://github.com/facebook/immutable-js/issues/203 – Nikita

回答

2

一般來說這是不可能的,因爲記錄和地圖具有非常不同的語義。地圖類型是使用鍵和值的類型進行參數化的,所以當您撥打.get時,您將獲得所有鍵的相同類型。

周圍有辦法,但:

declare class Map<T, K1=null, V1=null, K2=null, V2=null> { 

    constructor(val: T): void; 

    get(key: K1 & $Keys<T>): V1; 
    get(key: K2 & $Keys<T>): V2; 
    // etc 
} 

const m: Map<{ foo: string, bar: number }, 'foo', string, 'bar', number> = new Map({ 
    'foo': 'foo', 
    bar: 42 
}); 


m.get('foo') // string 
m.get('bar') // number 
m.get('baz') // error 

這可能是一個好主意,產生這樣的聲明帶有某種腳本的支持鍵值對所需量。

這樣的聲明有點冗長,但是如果你不弄亂類型參數,它是安全的。一對夫婦的意見:

  • 我們用最近的流量功能,讓我們來聲明默認類型參數,這樣我們就可以使用任意數量的鍵值對的單筆申報;

  • K1 & $Keys<T>確保我們只能使用T類型的實際密鑰來檢索值;這在一定程度上有助於一致性,但不幸的是,我發現無法驗證值類型的一致性,所以您必須小心這些。

+0

這很不幸對我們來說沒有什麼冗餘的可用 - 感謝有趣的解決方法 – gf3

相關問題