135 votes

Objet vide typé pour une variable typée

Dis que j'ai:

 type User = {
...
}
 

Je veux créer un nouveau user mais le définir comme objet vide:

 const user: User = {}; // This fails saying property XX is missing
const user: User = {} as any; // This works but I don't want to use any
 

Comment puis-je faire cela? Je ne veux pas que la variable soit null .

273voto

Shaun Luttin Points 1585

Mises en garde

Voici deux dignes mises en garde de la commentaires.

Soit vous souhaitez que l'utilisateur soit de type User | {} ou Partial<User>, ou vous avez besoin de redéfinir l' User type afin de permettre un objet vide. Maintenant, le compilateur est bien de vous dire que l'utilisateur n'est pas un Utilisateur. – jcalz

Je ne pense pas que cela devrait être considéré comme une bonne réponse, car elle crée des incohérences dans l'instance du type, de saper le but entier de caractères d'imprimerie. Dans cet exemple, la propriété Username est pas défini, alors que le type d'annotation est en train de dire qu'il ne peut pas être défini. – Ian Liu Rodrigues

Réponse

L'un des objectifs de conception de la Machine est de "trouver un équilibre entre l'exactitude et de la productivité." Si il sera productif pour vous, pour ce faire, utilisez le Type d'Assertions pour créer des objets vides pour les variables de type.

type User = {
    Username: string;
    Email: string;
}

const user01 = {} as User;
const user02 = <User>{};

user01.Email = "foo@bar.com";

Voici un exemple qui fonctionne pour vous.

Here are type assertions working with suggestion.

26voto

pixelpax Points 564

Dépend vraiment de ce que vous essayez de faire. Types de documents en caractères d'imprimerie, de sorte que vous voulez montrer à l'intention sur la façon dont cette chose est censé être utilisé lorsque vous êtes en train de créer le type.

Option 1: Si les Utilisateurs peuvent avoir certains, mais pas tous les attributs au cours de leur vie

Faire tous les attributs facultatifs

type User = {
  attr0?: number
  attr1?: string
}

Option 2: Si les variables contenant les Utilisateurs peuvent commencer à null

type User = {
...
}
let u1: User = null;

Si, vraiment, ici, si le point est à déclarer l'Utilisateur de l'objet avant qu'il peut être connu, ce qui va lui être attribué, vous voulez probablement faire let u1:User sans aucune affectation.

Option 3: Ce que vous voulez probablement

Vraiment, le postulat de base de la machine est de s'assurer que vous êtes conforme au modèle mental que vous décrivez dans types afin d'éviter de faire des erreurs. Si vous voulez ajouter des choses à un objet, un par un, c'est une habitude que la Machine tente de vous convaincre de ne pas le faire.

Plus probablement, vous voulez faire quelques variables locales, puis d'attribuer à l'Utilisateur contenant des variables quand il est prêt à être un plein sur l'Utilisateur. De cette façon, vous ne serez jamais à gauche avec une partie formé de l'Utilisateur. Ces choses sont bruts.

let attr1: number = ...
let attr2: string = ...
let user1: User = {
  attr1: attr1,
  attr2: attr2
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X