繁体   English   中英

使用接口定义新类型

[英]using interface to define a new type

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

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

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

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

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

====编辑====这是我根据您的评论所做的事情:

export interface IQuestionnaire {
  DataProcessingID: string;
  Qestions :  Array<Iquestion>
}
interface Iquestion{
        SecurityControl :  string,
        securityGoal: string[],
}

然后我去:

 IQuestions ={} as IQuestionnaire;

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

您应该改用这种方式对接口建模:

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

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

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

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

I前缀interface名称是TypeScript中的反模式,如本线程中所述

另外,由于此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: [""]
});

我更喜欢这样:

interface Foo {
    bar: number
    bas: string
}

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

您可以在此处或与此相关的stackoverflow问题中阅读有关对象初始化的更多信息。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM