当前位置: 首页 > 知识库问答 >
问题:

使用接口定义新类型

高高雅
2023-03-14

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

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

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

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

它实际上创建了一个空对象,这不是我想要的;但是如果没有这个,它会引发一个错误,例如,“无法读取未定义的属性‘问题’”。我定义新类型的方法是错误的吗?

====EDIT====以下是我根据你的评论所做的:

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

然后我说:

 IQuestions ={} as IQuestionnaire;

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

共有3个答案

司空朝
2023-03-14

我更喜欢这样做:

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"]
});
法玮
2023-03-14

接口名称前面加上I是TypeScript中的一种反模式,如本线程所述。

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

考虑创建你的<代码>接口<代码>链接如下:

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

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

编辑:

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

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

questionnaire.questions.push({
  securityControl: "",
  securityGoal: [""]
});
彭宏阔
2023-03-14

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

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

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

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

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

 类似资料:
  • 我正在编写一个代码,它取两个点,确定两个点的大小,比较它们,并返回哪个更大。我有我的主类和方法来运行所有的东西,然后还有另一个类点来实现我的接口。但是,我无法使从接口调用的方法正常工作。我的代码是: 当我尝试运行它时,我得到错误“exception in thread”main“java.lang.nullPointerException:不能调用”point.getMetality()“,因为”

  • 问题内容: 两者之间有什么区别,哪个更好使用?为什么? 问题答案: 是interface,哪里是class,并且此类实现接口。 我希望使用第二种形式,这种形式更通用,即如果您不使用特定于方法的方法,则可以将其类型声明为接口类型。使用第二种形式,将实现从实现更改为实现接口的其他类将变得更加容易。 编辑: 由于许多SO用户都评论了这两种形式都可以是接受或的任何方法的参数。但是当我声明方法时,我更喜欢接

  • 问题内容: 我计划在我的Swift项目中使用Google Drive API 。我正在尝试通过CocoaPods(v0.39.0)添加Drive SDK。以下是我的Podfile。 我添加了标志,以便CocoaPods可以将Objective-C Pod转换为Swift框架,而不是静态库。 吊舱安装成功。但是,当我构建项目时,出现以下错误。 类“ GTMHTTPUploadFetcher”的接口定

  • 首先定义一个特别的实体Repository interface。接口必须继承自Repository并且要定义为实体类和一个ID类型。如果你想要为这个实体类实现CRUD操作,继承CrudRepository替换Repository

  • 1.1.1. Rokid客户端协议 1.1.1. Rokid客户端协议 目录 Tts接口定义 speech接口定义 asr接口定义 nlp接口定义 Tts接口定义 调用接口 bool prepare(const char* config_file); void release(); bool prepared(); int speak(const char* content, TtsCall

  • 我想实现一个接口,它包含一系列函数和属性,很少函数需要在回调模式下工作。例如: 我想执行generateData函数并在作业完成后通知。例如: 我完全误解了接口中回调的语法和调用。如果有人举例说明,那就太好了。