我正在使用接口定义新类型。这是正确的方法吗?我的工作如下:
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'。我不想在定义接口的地方启动它们,因为它会创建一个空对象!
答案 0 :(得分:2)
您应该改用这种方式对界面建模:
export interface IQuestionnaire {
DataProcessingID: string;
Qestion: Security[];
}
interface Security {
SecurityControl: string;
securityGoal: string[];
}
原因是Qestion
实际上是对象数组,并且每个对象都包含SecurityControl
和securityGoal
属性。无论如何,我相信您的意思是“问题”而不是“问题”。
在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";
您可以在here或this 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"]
});