Dans les classes TypeScript, il est possible de déclarer des types pour les propriétés, par exemple:
class className {
property: string;
};
Comment déclarer le type d'une propriété dans un objet littéral?
J'ai essayé le code suivant mais il ne compile pas:
var obj = {
property: string;
};
J'obtiens l'erreur suivante:
Le nom «chaîne» n'existe pas dans la portée actuelle
Suis-je en train de faire quelque chose de mal ou est-ce un bug?
typescript
Dace Zarina
la source
la source
Mise à jour 2019-05-15 (modèle de code amélioré comme alternative)
Après de nombreuses années à utiliser
const
et à bénéficier d'un code plus fonctionnel, je recommanderais de ne pas utiliser ce qui suit dans la plupart des cas. (Lors de la construction d'objets, forcer le système de types dans un type spécifique au lieu de le laisser déduire des types est souvent une indication que quelque chose ne va pas).Au lieu de cela, je recommanderais d'utiliser des
const
variables autant que possible, puis de composer l'objet comme étape finale:Ajout 2020-02-26
Si vous avez réellement besoin d'un type que vous pouvez initialiser paresseusement: marquez qu'il s'agit d'un type d'union annulable (null ou Type). Le système de type vous empêchera de l'utiliser sans vous assurer au préalable qu'il a une valeur.
Dans
tsconfig.json
, assurez-vous d'activer les vérifications nulles strictes:"strictNullChecks": true
Ensuite, utilisez ce modèle et autorisez le système de type à vous protéger contre les accès nuls / non définis accidentels:
Ne faites pas ce qui suit dans 99% des cas:
Mise à jour 2016-02-10 - Pour gérer TSX (Merci @Josh)
Utilisez l'
as
opérateur pour TSX.Un exemple plus long:
Réponse originale
Utilisez l'opérateur de transtypage pour rendre cette opération succincte (en transtypant null au type souhaité).
Un exemple plus long:
C'est bien mieux que d'avoir deux parties (une pour déclarer les types, la seconde pour déclarer les valeurs par défaut):
la source
property: null as string
où la différence importante est l'as
opérateur.call
dans votre deuxième exemple, pouvez-vous lui attribuer un type complètement différent?Error:(33, 15) TS2352:Type 'null' cannot be converted to type 'string'.
Je suis surpris que personne n'ait mentionné cela, mais vous pouvez simplement créer une interface appelée
ObjectLiteral
, qui accepte deskey: value
paires de typestring: any
:Ensuite, vous l'utiliseriez, comme ceci:
Un bonus supplémentaire est que vous pouvez réutiliser cette interface autant de fois que vous le souhaitez, sur autant d'objets que vous le souhaitez.
Bonne chance.
la source
[key: string]
partie, pas de la partie quelconque comme définition du type de la valeur ... Cela supprimerait en effet l'utilité des types.Si vous essayez d'écrire une annotation de type, la syntaxe est:
Si vous essayez d'écrire un littéral objet, la syntaxe est:
Votre code essaie d'utiliser un nom de type dans une position de valeur.
la source
var x: { property: string; } = ...;
est une allumeuse! J'espérais que les points de suspension étaient une syntaxe valide pour être un raccourcivar x: { property: string; } = { property: 'hello' };
.Dans TypeScript, si nous déclarons un objet, nous utilisons la syntaxe suivante:
Par exemple:
la source
Si vous essayez d'ajouter des typages à un littéral d'objet déstructuré , par exemple dans les arguments d'une fonction, la syntaxe est:
la source
Si vos propriétés ont le même type, vous pouvez utiliser un type d'utilitaire prédéfini
Record
:Vous pouvez bien sûr aller plus loin et définir un type personnalisé pour les valeurs de votre propriété:
la source
let
au lieu d'var
ici.la source
Dans votre code:
Vous créez en fait un littéral objet et affectez la chaîne de variables à la propriété myProp. Bien que très mauvaise pratique, ce serait en fait du code TS valide (ne l'utilisez pas!):
Cependant, ce que vous voulez, c'est que le littéral de l'objet soit tapé. Cela peut être réalisé de différentes manières:
Interface:
Type personnalisé:
Opérateur de casting:
Type d'objet littéral:
la source