2016-06-21 5 views
13

Zum Beispiel angesichts der folgenden Datensatz:Ist es möglich, einen Bewegungstyp in einen unveränderlichen Container zu verpacken?

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

Gibt es eine Möglichkeit das Äquivalent der folgenden Funktionen ausführen:

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

Ansonsten habe ich am Ende oben einfach so etwas wie Map<string, any> mit denen ich glaube, wegnimmt Verwenden Sie Immutable.js mit dem Flow-Typ-System.

+0

Beachten Sie, dass es eine WIP immutable.js-Flussschnittstelle gibt, die Sie manuell in Ihr Projekt aufnehmen müssten. Ich weiß nicht, ob es gut oder überhaupt funktioniert. Siehe https://github.com/facebook/immutable-js/blob/master/type-definitions/immutable.js.flow und https://github.com/facebook/immutable-js/issues/203 – Nikita

Antwort

2

Im Allgemeinen ist dies nicht möglich, da Datensätze und Karten eine sehr unterschiedliche Semantik haben. Der Kartentyp wird mit Schlüssel- und Werttypen parametriert. Wenn Sie also .get aufrufen, erhalten Sie den gleichen Typ für alle Schlüssel.

Es gibt einen Weg um, aber:

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 

Es ist wahrscheinlich eine gute Idee, eine solche Erklärung mit irgendeiner Art von Skript zu generieren gewünschte Menge von Schlüssel-Wert-Paare zu unterstützen.

Eine solche Deklaration ist ein bisschen ausführlich, aber sicher, wenn Sie nicht Typ Parameter versauen. Ein paar Anmerkungen:

  • wir den letzten Fluss Funktion verwenden, die uns Standardtyp Parameter deklarieren können, so dass wir eine einzige Erklärung für eine beliebige Anzahl von Schlüssel-Wert-Paare verwenden könnte;

  • K1 & $Keys<T> stellt sicher, dass wir nur tatsächliche Schlüssel vom Typ T verwenden können, um Werte abzurufen; Dies hilft in gewissem Maße bei der Konsistenz, leider habe ich keine Möglichkeit gefunden, die Konsistenz der Wertetypen zu überprüfen, also müssen Sie vorsichtig mit diesen sein.

+0

Es ist bedauerlich, dass es gibt nichts weniger Ausführliches für uns - danke für die interessante Problemumgehung – gf3

Verwandte Themen