Je suis tombé sur cela en cherchant un meilleur moyen que ce à quoi j'étais arrivé. Après avoir lu les réponses et les avoir essayées, j'ai pensé qu'il valait la peine de poster ce que je faisais car les autres réponses ne me semblaient pas aussi succinctes. Il était important pour moi de n'avoir à écrire qu'une petite quantité de code à chaque fois que je mettais en place une nouvelle interface. Je me suis installé sur ...
À l'aide d'une fonction deepCopy générique personnalisée:
deepCopy = <T extends {}>(input: any): T => {
return JSON.parse(JSON.stringify(input));
};
Définissez votre interface
interface IX {
a: string;
b: any;
c: AnotherType;
}
... et définissez les valeurs par défaut dans un const séparé.
const XDef : IX = {
a: '',
b: null,
c: null,
};
Puis lancez comme ceci:
let x : IX = deepCopy(XDef);
C'est tout ce dont vous avez besoin.
.. cependant ..
Si vous souhaitez initialiser un élément racine de manière personnalisée, vous pouvez modifier la fonction deepCopy pour accepter les valeurs par défaut personnalisées. La fonction devient:
deepCopyAssign = <T extends {}>(input: any, rootOverwrites?: any): T => {
return JSON.parse(JSON.stringify({ ...input, ...rootOverwrites }));
};
Qui peut alors être appelé comme ceci à la place:
let x : IX = deepCopyAssign(XDef, { a:'customInitValue' } );
Tout autre moyen préféré de copie profonde fonctionnerait. Si seulement une copie superficielle est nécessaire, Object.assign suffirait, renonçant au besoin de l'utilitaire deepCopyou de la deepCopyAssignfonction.
let x : IX = object.assign({}, XDef, { a:'customInitValue' });
Problèmes connus
- Il ne sera pas assigné en profondeur sous cette forme, mais il n'est pas trop difficile de modifier
deepCopyAssignpour itérer et vérifier les types avant d'affecter.
- Les fonctions et références seront perdues par le processus d'analyse / stringify. Je n'en ai pas besoin pour ma tâche et l'OP non plus.
- Les valeurs init personnalisées ne sont pas indiquées par l'EDI ou le type vérifié lors de l'exécution.