2016-06-21 34 views
13

Na przykład, biorąc pod uwagę następujący zapis:Czy można owinąć typ przepływu w niezmienny pojemnik?

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

Czy istnieje jakiś sposób, aby zrobić równowartość co następuje:

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

przeciwnym razie skończy się po prostu za coś Map<string, any> który myślę gładzi z używania Immutable.js z systemem typu Flow.

+0

Należy zauważyć, że istnieje interfejs przepływu immutable.js w WIP, który należy wprowadzić ręcznie do projektu. Nie wiem, czy to działa dobrze, czy w ogóle. Zobacz https://github.com/facebook/immutable-js/blob/master/type-definitions/immutable.js.flow i https://github.com/facebook/immutable-js/issues/203 – Nikita

Odpowiedz

2

Zasadniczo nie jest to możliwe, ponieważ zapisy i mapy mają bardzo różną semantykę. Typ mapy jest sparametryzowany za pomocą typów klucza i wartości, więc po wywołaniu .get otrzymasz ten sam typ dla wszystkich kluczy.

Jest odwrotnie, choć:

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 

To chyba dobry pomysł, aby wygenerować taką deklarację z jakimś skryptem wspierać żądaną ilość par klucz-wartość.

Taka deklaracja jest nieco obszerna, ale bezpieczna, jeśli nie naruszysz parametrów typu. Kilka uwag:

  • używamy najnowszej funkcji przepływu, który pozwala nam zadeklarować parametr domyślny typ, tak, że możemy użyć jednej deklaracji dla dowolnej liczby par klucz-wartość;

  • K1 & $Keys<T> zapewnia, że ​​możemy używać tylko rzeczywistych kluczy typu T do pobierania wartości; to pomaga w pewnym stopniu, niestety nie znalazłem sposobu sprawdzenia spójności typów wartości, więc musisz być z nimi ostrożny.

+0

To niefortunne, że nie ma nic mniej gadatliwego - dzięki za interesujące obejście – gf3