0
votes

Utilisation de l'interface pour définir un nouveau type

J'utilise une interface pour définir un nouveau type. Est-ce une approche correcte? Je fais comme suit: xxx

puis, pour instancier de celui-ci, je dois le faire: xxx

qui crée un objet vide qui crée un objet vide qui n'est pas ce que je veux; Mais sans cela, cela soulève une erreur en disant, par exemple, "ne peut pas lire les" questions "de non définies". Est-ce que mon approche est incorrecte pour définir un nouveau type?

==== EDIT ==== Voici ce que j'ai fait selon vos commentaires: xxx

puis je vais: xxx

alors je l'obtiens encore ERREUR: ne peut pas lire la propriété 'Push' de non défini . Je ne veux pas les initier où je définis l'interface, car elle crée un objet vide!


5 commentaires

Votre interface est iQuestionandanswer , alors que l'objet que vous essayez d'instancier est de iQuestionnAIRE


Mon mauvais, j'ai mis la mauvaise interface. Pardon. J'ai édité la question


Vous ne pouvez pas écrire uniquement Laisser la question: iQuestionnare = {} ?


non, alors il dit un objet indéfini


DataProcessingIDID et QESTTIONS sont les membres requis de votre iQuestionnaire . Donc, vous ne devriez pas l'initialiser avec un objet vide pour commencer. De plus, étant donné que qestions est un type de tableau et vous ne l'avez pas initialisé, mais vous essayez de faire pression sur un objet, il lance une erreur. S'il vous plaît lisez ma réponse avec soin. :)


3 Réponses :


1
votes

Je préfère le faire comme ceci:

export interface Question {
  securityControl: string,
  securityGoal: string[],
}

export interface Questionnaire {
  dataProcessingID: string;
  questions: Question[];
}

let questionaire = {} as Questionnaire;
questionaire.dataProcessingID = "12345";
questionaire.questions = [];

questionaire.questions.push({
    securityControl: "control"
    securityGoal: ["goal"]
});


2 commentaires

Au lieu du {} en tant que question , vous pouvez avoir tout dans une instruction: {SecurityControl: ..., Securitygoal: ...}


Cette approche permet de la sécurité du type. Il n'est pas en fait assuré que toutes les propriétés ont été définies.



2
votes

Vous devez modéliser votre interface de cette façon à la place:

export interface IQuestionnaire {
  DataProcessingID: string;
  Qestion: Security[];
}

interface Security {
  SecurityControl: string;
  securityGoal: string[];
}


0 commentaires

2
votes

Préfixing interface code> Noms avec i code> est un anti-motif de type Typecript que mentionné dans Ce fil strong>.

aussi, puisque cette interface code> sera éventuellement sous forme de modèle de données Pour un objet JSON, les propriétés de l'interface doivent être dans bownerCamelcase em> comme une convention. p>

envisagez de créer votre interface code> chaîne comme ceci: p >

questionnaire: Questionnaire = {
  dataProcessingID: '',
  questions: []
};

questionnaire.questions.push({
  securityControl: "",
  securityGoal: [""]
});


5 commentaires

Merci les gars. J'ai appliqué ceci. Mais pourtant, je reçois "" ne peut pas lire la propriété "push" de non défini "qui fait référence à la question, c'est-à-dire une matrice de l'interface.


Il doit être initialisé. N'oubliez pas de faire ça.


Oui, j'ai fait comme: "" Iquesttions = {} comme Iquestionnaire; ""


J'ai mis à jour la réponse. S'il vous plaît vérifier pour voir si cela corrige votre problème.


Vous devez toujours initialiser votre tableau dans votre objet, sinon vous ne pouvez pas appuyer sur elle. Donc, vous créez un tableau vide ou vous créez un tableau avec un objet de questions et définissez le questionnaire.Questtions à la matrice. Après cela, vous pouvez pousser un nouvel objet avec .Push () puisque le tableau n'est plus indéfini. Voir ma réponse mise à jour.