sort - Cómo describir la forma del mapa de Immutable.js con Flow
map immutable js (1)
TL; DR;
No, pero al utilizar Registros, puede hacer que Flow seleccione la forma, pero no los tipos.
Forma larga
La respuesta correcta sería: no, ya que los mapas no tienen formas (al menos en Flow e Inmutable) . Pero Immutable tiene un tipo de "Mapas" con formas. Eso sería Registros . Pero por las razones que se describen a continuación (dado que no es estrictamente relevante), el flujo libdef para Immutable.Record es muy flexible y, en realidad, no comprueba las formas.
Un mejor registro libdef
Si ignoramos la característica (posiblemente innecesaria) de acceder directamente a las propiedades de registro, podemos crear una mejor libdef. El se vería así:
declare class Record<T: Object> {
static <T: Object>(spec: T, name?: string): Record<T>;
get: <A>(key: $Keys<T>) => A;
set<A>(key: $Keys<T>, value: A): Record<T>;
remove(key: $Keys<T>): Record<T>;
}
Con esta declaración podemos definir la forma del registro . Aquí está en acción . Pero todavía no podemos definir los tipos de los valores reales. Flow define un tipo $PropertyType<T, K>
. Que toma un objeto T
y una cadena literal K
Para que $PropertyType
funcione en nuestro caso, debería funcionar con $Keys<T>
que es un tipo de unión de cadena. Hace unas semanas se abrió un problema para que esto suceda. Se puede encontrar aquí .
Diferencia entre mapa y objeto
En flujo, son bastante diferentes. Esto es un mapa:
type MyMaps = { [key: string]: number }
Las claves reales son desconocidas. Lo único que sabe Flow es que todas las claves deben ser cadenas y todos los valores deben ser números. Un tipo de objeto, por otro lado, tiene el siguiente aspecto:
type MyObject = { a: string, x: boolean }
Al crear o cambiar un objeto, newObj
, de tipo MyObject
Flow, comprobará que newObj.a
es una cadena y newObj.x
es un booleano.
Por qué la definición actual es tan floja
Un registro expone cada par clave / valor a través del acceso directo a la clave.
type R = { a: string }
const r = Record({ a: ''Supa'' })
r.a === r.get(''a'')
Esto requeriría que la definición de tipo de r
sea una intersección de Record<R>
y R
(no exactamente, pero está lo suficientemente cerca). Asi que:
(r: R & Record<R>)
Esto no funciona porque Flow carece de soporte para intersectar tipos con objetos. Así es como se ve en acción .
Me gustaría describir la forma de un mapa usando las definiciones de tipo de flujo de Immutable.
Puede describir la forma de un objeto de la siguiente manera:
const stateShape: {
id: number,
isActive: boolean
} = {
id: 123,
isActive: true
};
¿Hay algo similar para los mapas de Immutable?