Convertir JSON en modèles MobX State Tree — Numio
Convertit un snapshot JSON en définition de modèle MobX-State-Tree, const myModel = t.model({...}). Les objets deviennent t.model, les tableaux t.array(...) construit à partir de tous les éléments, et les clés absentes ou null dans certains éléments t.maybe ou t.maybeNull.
Amorcer le modèle d’un store à partir d’une réponse d’API existante ou d’un snapshot enregistré.
JSON
MobX-State-Tree Model
Quand l’utiliser
- Amorcer le modèle d’un store à partir d’une réponse d’API existante ou d’un snapshot enregistré.
- Passer un état observable simple à MobX-State-Tree sans écrire chaque appel types.* à la main.
Mode d’emploi
- Collez un snapshot JSON de l’état de votre store.
- Vérifiez la sortie t.model({...}) ; les tableaux d’objets contiennent un seul t.model inline fusionné à partir de tous les éléments.
- Copiez-la, ajoutez import { types as t } from "mobx-state-tree", puis ajoutez identifiants, actions et views.
Snapshot JSON
{
"filter": "all",
"selectedId": null,
"todos": [
{ "id": 1, "title": "Write docs", "done": false, "tags": ["work"] },
{ "id": 2, "title": "Ship", "done": true, "dueAt": null }
]
}Modèle MobX-State-Tree
const myModel = t.model({
filter: t.string,
selectedId: t.frozen(),
todos: t.array(
t.model({
id: t.number,
title: t.string,
done: t.boolean,
tags: t.maybe(t.array(t.string)),
dueAt: t.maybe(t.frozen()),
}),
),
})Détails et limites
S’exécute dans un Web Worker du navigateur ; rien n’est envoyé. La sortie est formatée avec Prettier.
null à côté d’une valeur réelle donne t.maybeNull(type) ; une valeur toujours null, ainsi que les éléments d’un tableau vide, deviennent t.frozen(), qui accepte toute valeur sérialisable.
Les clés absentes de certains éléments d’un tableau deviennent t.maybe(...). Les tableaux de types mixtes utilisent t.union, comme t.array(t.union(t.number, t.string)).
Les identifiants ne sont pas détectés comme types.identifier, et aucune valeur par défaut t.optional, aucune action ni view n’est générée.
FAQ
La racine du JSON peut-elle être un tableau ?
Oui. Le résultat devient t.array(t.model({...})) avec les clés de tous les éléments fusionnées ; les clés absentes de certains éléments sont enveloppées dans t.maybe.
Pourquoi mon champ id est-il t.number et pas un identifier ?
Le convertisseur ne regarde que les types des valeurs. Remplacez-le par t.identifier ou t.identifierNumber si vous avez besoin de références ou d’une réconciliation par id.
Puis-je inclure des fonctions dans l’entrée ?
Une entrée qui n’est pas du JSON valide est parsée comme un littéral d’objet JavaScript : les expressions de fonction deviennent alors t.frozen. Dans ce mode, seul le premier élément de chaque tableau est utilisé ; une entrée JSON est donc recommandée.