2016-06-21 4 views
13

Ad esempio, dato il seguente record:È possibile avvolgere un tipo di flusso in un contenitore immutabile?

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

C'è qualche modo per fare l'equivalente di quanto segue:

/* @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); 

Altrimenti finiscono semplicemente usando qualcosa come Map<string, any> che credo toglie dall'utilizzo di Immutable.js con il sistema di tipo Flow.

+0

Si noti che esiste un'interfaccia di flusso immutable.js WIP che è necessario includere manualmente nel progetto. Non so se funziona bene, o del tutto. Vedi https://github.com/facebook/immutable-js/blob/master/type-definitions/immutable.js.flow e https://github.com/facebook/immutable-js/issues/203 – Nikita

risposta

2

In generale ciò non è possibile poiché i record e le mappe hanno una semantica molto diversa. Il tipo di mappa è parametrizzato con tipi di chiave e valore, quindi quando chiami .get otterrai lo stesso tipo per tutte le chiavi.

C'è un modo per aggirare, però:

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 

E 'probabilmente una buona idea per generare tale dichiarazione con una sorta di script per supportare quantità desiderata di coppie chiave-valore.

Tale dichiarazione è un po 'prolissa, ma sicura se non si incasinano i parametri di tipo. Un paio di commenti:

  • usiamo funzione del flusso recente che ci permette di dichiarare parametro di tipo predefinito, in modo da poter utilizzare una sola dichiarazione per qualsiasi numero di coppie chiave-valore;

  • K1 & $Keys<T> assicura che è possibile utilizzare solo le chiavi effettive di tipo T per recuperare i valori; questo aiuta con coerenza in una certa misura, sfortunatamente, non ho trovato modo di verificare la coerenza dei tipi di valore, quindi devi stare attento con quelli.

+0

È un peccato che non c'è niente di meno verboso a nostra disposizione, grazie per l'interessante soluzione alternativa – gf3

Problemi correlati