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