使用接口定义新类型

时间:2019-05-31 07:44:57

标签: angular typescript

我正在使用接口定义新类型。这是正确的方法吗?我的工作如下:

0 even
1 odd
2 even
3 odd
4 even

然后,要实例化它,我必须这样做:

0 even
1 odd
2 even
3 odd
4 even
4

实际上创建一个不是我想要的空对象;但是如果没有此设置,则会引发错误,例如,“无法读取未定义的属性'Questions'”。我的方法定义新类型是否错误?

==== EDIT ==== 这是我根据您的评论所做的:

export interface IQuestionnaire {
  DataProcessingID: string;
  Qestions : [{
        SecurityControl :  string,
        securityGoal: string[],
          }]
}

然后我去

      IQuestions :  IQuestionnaire = {
    DataProcessingID: "",
     Qestions :[{
           SecurityControl :  "",
           securityGoal: [""]
               }]
  };

然后我仍然出现此错误:无法读取未定义的属性'push'。我不想在定义接口的地方启动它们,因为它会创建一个空对象!

3 个答案:

答案 0 :(得分:2)

您应该改用这种方式对界面建模:

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

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

原因是Qestion实际上是对象数组,并且每个对象都包含SecurityControlsecurityGoal属性。无论如何,我相信您的意思是“问题”而不是“问题”。

在component.ts上,您可以简单地初始化对象。

答案 1 :(得分:2)

使用interface前缀I名称是TypeScript中的反模式,如 this thread 中所述。

此外,由于此interface最终将用作JSON对象的数据模型,因此接口中的属性应作为惯例放在 lowerCamelCase 中。

考虑像这样创建interface链:

interface Question {
  securityControl: string,
  securityGoal: Array<string>,
}

export interface Questionnaire {
  dataProcessingID: string;
  questions: Array<Question>;
}

编辑:

要初始化它,请执行以下操作:

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

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

答案 2 :(得分:1)

我更喜欢这样:

interface Foo {
    bar: number
    bas: string
}

let foo = {} as Foo;
foo.bar = 123;
foo.bas = "Hello World";

您可以在herethis related stackoverflow question中了解有关对象初始化的更多信息。

结合其他答案,它看起来像这样:

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"]
});