Comment puis-je attribuer dynamiquement des propriétés à un objet en caractères d'imprimerie?
Si je voulais par programmation d'attribuer une propriété à un objet en Javascript, je voudrais faire comme ceci:
var obj = {};
obj.prop = "value";
Mais en caractères d'imprimerie, cela génère une erreur:
La propriété "prop" n'existe pas sur la valeur de type '{}'
Comment suis-je censé affecter une nouvelle propriété à un objet en caractères d'imprimerie?
- FYI. J'ai ouvert une discussion liées à cette option si vous souhaitez suivre.
Vous devez vous connecter pour publier un commentaire.
Il est possible de désigner
obj
commeany
, mais cela va à l'encontre de l'objectif même de l'utilisation de la machine.obj = {}
impliqueobj
est unObject
. Le marquant commeany
n'a pas de sens. Pour accomplir la consistance désirée d'une interface peut être définie comme suit.OU pour le rendre compact:
LooseObject
peut accepter des champs avec une chaîne comme la clé etany
type de valeur.La véritable élégance de cette solution est que vous pouvez inclure typesafe champs dans l'interface.
LooseObject
peut prendre une Erreur que de bien.class YourClass implements MyType { get requiredProp1(){...} }
Ou tous d'un coup:
any
afin de l'utiliser? Devient juste extra bruit dans mon code.. :/any
. La machine est utilisée pour intercepter les erreurs (potentielles) au moment de la compilation. Si vous lancez àany
pour couper erreurs, alors vous perdez la puissance de frappe et peut ainsi revenir à la pure JS.any
devrait idéalement être utilisé seulement si vous êtes l'importation de code pour laquelle vous ne pouvez pas écrire TS définitions ou lors de la migration de votre code JS à TSJ'ai tendance à mettre
any
de l'autre côté, c'est à direvar foo:IFoo = <any>{};
Donc quelque chose comme ceci est encore typesafe:Sinon, vous pouvez marquer ces propriétés en tant qu'option:
Essayer en ligne
I still have <any>{
alors vous n'avez pas compilé. Tapuscrit serait de le supprimer dans son émettentvar foo: IFoo = {} as any
est préféré. L'ancienne syntaxe pour typecasting était en collision avec la TSX (Tapuscrit-identifiés JSX).Cette solution est particulièrement utile lorsque votre objet a de Type Spécifique. Comme lors de l'obtention de l'objet à une autre source.
Bien que le compilateur se plaint qu'il devrait encore sortie que vous souhaitez. Toutefois, cela fonctionnera.
Une option de plus faire, c'est d'accéder à la propriété en tant que collection:
JS:
Object.assign(obj, {prop: "value"})
de ES6/ES2015 œuvres, trop.Il est possible d'ajouter un membre à un objet existant en
Javascript:
Tapuscrit:
Stocker toute nouvelle propriété sur tout type d'objet par typecasting à 'tout':
Plus tard, vous pouvez le récupérer par la coulée de votre objet étendu à 'tout':
Garantir que le type est un
Object
(c'est à dire paires clé-valeur), utilisation:Cas 1:
var car = {type: "BMW", model: "i8", color: "white"};
car['owner'] = "ibrahim"; //You can add a property:
Cas 2:
var car:any = {type: "BMW", model: "i8", color: "white"};
car.owner = "ibrahim"; //You can set a property: use any type
Vous pouvez ajouter cette déclaration pour faire taire les avertissements.
declare var obj: any;
La meilleure pratique est l'utilisation sécuritaire de frappe, je vous recommande:
Vous pouvez créer de nouveaux objets basés sur l'ancien objet à l'aide de la propagation de l'opérateur
Tapuscrit permettra de déduire tous les champs de l'objet d'origine et VSCode fera l'autocomplétion, etc.
Pour préserver votre type précédent, plâtre temporaire de votre objet tout
La nouvelle dynamique de la propriété ne sera disponible que lorsque vous utilisez le casting:
Je suis surpris qu'aucune des réponses de l'Objet de référence.attribuer puisque c'est la technique que j'utilise chaque fois que je pense à propos de "composition" en JavaScript.
Et il fonctionne comme prévu en caractères d'imprimerie:
Avantages
any
de type&
lors de la déclaration du type deobjectWithAllProps
), qui communique clairement que nous sommes en train de composer un nouveau type à la volée (c'est à dire de façon dynamique)De choses à connaître
existingObject
reste intacte et donc n'a pas unemail
de la propriété. Pour la plupart fonctionnelle de style programmeurs, c'est une bonne chose puisque le résultat est le seul nouveau changement).La plus simple sera la suite
Si vous utilisez la Machine, je suppose que vous voulez utiliser le type de sécurité; dans ce cas, nu, Objet et "tout" sont counterindicated.
Mieux de ne pas utiliser d'Objet ou {}, mais certains nommée de type; ou vous pourriez être en utilisant une API avec des types spécifiques, qui vous avez besoin de s'étendre avec vos propres champs. J'ai trouvé que c':
attribuer dynamiquement des propriétés à un objet en caractères d'imprimerie.
de faire que Vous avez juste besoin d'utiliser la machine interfaces comme ceci:
vous pouvez l'utiliser comme ça
attributes
champ à l'intérieur deSomeClass
et cela devrait résoudre le problèmepublic attributes: IType = {};
pastebin.com/3xnu0TnNvous pouvez utiliser ceci :
Si vous êtes en mesure d'utiliser les fonctions JavaScript ES6, vous pouvez utiliser Propriété Calculée Noms de gérer très facilement:
L' [req.id] clé d'objet a une valeur dynamique