Si je voulais assigner par programme une propriété à un objet en Javascript, je le ferais comme ceci:
var obj = {};
obj.prop = "value";
Mais en TypeScript, cela génère une erreur:
La propriété 'prop' n'existe pas sur la valeur de type '{}'
Comment suis-je censé attribuer une nouvelle propriété à un objet dans TypeScript?
typescript
Peter Olson
la source
la source
Réponses:
Il est possible de désigner
obj
commeany
, mais cela va à l'encontre du but de l'utilisation du tapuscrit.obj = {}
impliqueobj
est unObject
. Le marquer commeany
n'a aucun sens. Pour atteindre la cohérence souhaitée, une interface peut être définie comme suit.OU pour le rendre compact:
LooseObject
peut accepter des champs avec n'importe quelle chaîne comme clé etany
taper comme valeur.La vraie élégance de cette solution est que vous pouvez inclure des champs de type sécurisé dans l'interface.
la source
LooseObject
peut également prendre une erreur.Ou tout d'un coup:
la source
any
pour l'utiliser?any
. TypeScript est utilisé pour détecter les erreurs (potentielles) au moment de la compilation. Si vous lancezany
pour couper les erreurs, vous perdez le pouvoir de taper et vous pouvez aussi revenir à JS pur.any
devrait idéalement être utilisé uniquement si vous importez du code pour lequel vous ne pouvez pas écrire de définitions TS ou lors de la migration de votre code de JS vers TSJ'ai tendance à mettre
any
de l'autre côté,var foo:IFoo = <any>{};
donc quelque chose comme ça est toujours sûr:Vous pouvez également marquer ces propriétés comme facultatives:
Essayez-le en ligne
la source
I still have <any>{
alors vous n'avez pas compilé. TypeScript supprimerait cela dans son émissionvar foo: IFoo = {} as any
est préféré. L'ancienne syntaxe de transtypage était en collision avec TSX (Typescript-ified JSX).Cette solution est utile lorsque votre objet a un type spécifique. Comme lors de l'obtention de l'objet à une autre source.
la source
Bien que le compilateur se plaigne, il devrait toujours le produire selon vos besoins. Cependant, cela fonctionnera.
la source
Une autre option consiste à accéder à la propriété en tant que collection:
la source
Object.assign(obj, {prop: "value"})
de ES6 / ES2015 fonctionne aussi.Je suis surpris qu'aucune des réponses ne fasse référence à Object.assign car c'est la technique que j'utilise chaque fois que je pense à la "composition" en JavaScript.
Et cela fonctionne comme prévu dans TypeScript:
Les avantages
any
type&
lors de la déclaration du type deobjectWithAllProps
), qui indique clairement que nous composons un nouveau type à la volée (c'est-à-dire dynamiquement)Choses à savoir
existingObject
reste intact et n'a donc pas deemail
propriété. Pour la plupart des programmeurs de style fonctionnel, c'est une bonne chose car le résultat est le seul nouveau changement).la source
Vous pouvez créer un nouvel objet basé sur l'ancien objet à l'aide de l'opérateur d'étalement
TypeScript déduira tous les champs de l'objet d'origine et VSCode effectuera la saisie semi-automatique, etc.
la source
Le plus simple suivra
la source
Il est possible d'ajouter un membre à un objet existant en
la source
Puisque vous ne pouvez pas faire cela:
Si votre compilateur TS et votre linter ne vous stricte pas, vous pouvez écrire ceci:
Si votre compilateur TS ou linter est strict, une autre réponse serait de transtyper:
la source
Stockez toute nouvelle propriété sur n'importe quel type d'objet en la transtypant en «n'importe quoi»:
Plus tard, vous pouvez le récupérer en redéfinissant votre objet étendu sur 'any':
la source
Pour garantir que le type est un
Object
(c'est -à- dire des paires clé-valeur ), utilisez:la source
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
la source
vous pouvez utiliser ceci:
la source
Vous pouvez ajouter cette déclaration pour désactiver les avertissements.
declare var obj: any;
la source
La meilleure pratique est d'utiliser une saisie sécurisée, je vous recommande:
la source
Pour conserver votre type précédent, transformez temporairement votre objet en n'importe quel
La nouvelle propriété dynamique ne sera disponible que lorsque vous utiliserez le cast:
la source
Voici une version spéciale de
Object.assign
, qui ajuste automatiquement le type de variable à chaque changement de propriété. Pas besoin de variables supplémentaires, d'assertions de types, de types explicites ou de copies d'objets:Remarque: l' exemple utilise des fonctions d'assertion TS 3.7 . Le type de retour de
assign
estvoid
, contrairement àObject.assign
.la source
Si vous utilisez Typescript, vous souhaitez probablement utiliser la sécurité de type; auquel cas Object nu et 'any' sont contre-indiqués.
Mieux vaut ne pas utiliser Object ou {}, mais certains types nommés; ou vous utilisez peut-être une API avec des types spécifiques, que vous devez étendre avec vos propres champs. J'ai trouvé que cela fonctionnait:
la source
affecter dynamiquement des propriétés à un objet dans TypeScript.
pour ce faire, il vous suffit d'utiliser des interfaces dactylographiées comme ceci:
vous pouvez l'utiliser comme ça
la source
attributes
champ à l'intérieurSomeClass
et cela devrait le corrigerpublic attributes: IType = {};
pastebin.com/3xnu0TnNEssaye ça:
Ensuite, utilisez-le
la source
La seule solution entièrement sécurisée est celle-ci , mais elle est un peu verbeuse et vous oblige à créer plusieurs objets.
Si vous devez d'abord créer un objet vide, choisissez l'une de ces deux solutions. Gardez à l'esprit que chaque fois que vous utilisez
as
, vous perdez votre sécurité.Solution plus sûre
Le type de
object
est sûr à l' intérieurgetObject
, ce qui signifieobject.a
qu'il sera de typestring | undefined
Solution courte
Le type de
object
n'est pas sûr à l' intérieurgetObject
, ce qui signifieobject.a
qu'il sera de typestring
même avant son affectation.la source