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.
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