这是我的属性,其中多次定义接口:
ExamStatusId = {
All: <IEnumElement>{
id: this.examStatusSelectId,
text: 'Exam Status: All',
val: 0
},
Current: <IEnumElement>{
id: this.examStatusSelectId,
text: 'Exam Status: Current',
val: 1
}
}
这是我的界面:
interface IEnumElement {
elem: string;
text: string;
val: number
}
有什么方法可以避免在ExamStatusId的每个属性之后指定接口?
答案 0 :(得分:1)
是的,可以使用额外的界面,如下面的代码。通用的IIndexable接口使其在不同的地方也很容易使用!
interface IEnumElement {
elem: string;
text: string;
val: number
}
interface IIndexable<T> {
[index: string]: T;
}
var ExamStatusId: IIndexable<IEnumElement> = {
All: {
elem: "",
text: 'Exam Status: All',
val: 0
},
Current: {
elem: "asdf",
text: 'Exam Status: Current',
val: 1
},
X: {} // this is now an error!
}
编辑:使用界面的好处是你也可以获得自动完成功能!
答案 1 :(得分:1)
您尚未包含elem
属性,因此您需要这样做(尽管这是切向的)。
我的建议是你接受类型推理的奇迹,并且这样做:
interface IEnumElement {
elem: string;
text: string;
val: number
}
class Exam {
private examStatusSelectId: number;
ExamStatusId = {
All: {
id: this.examStatusSelectId,
elem: '',
text: 'Exam Status: All',
val: 0
},
Current: {
id: this.examStatusSelectId,
elem: '',
text: 'Exam Status: Current',
val: 1
}
}
}
// This function must be passed an IEnumElement
function example(element: IEnumElement) {
}
var exam = new Exam();
// The compiler knows this is good
example(exam.ExamStatusId.All);
如果在类上声明ExamStatusId
属性时未包含正确的属性,编译器将正确检测问题并告诉您,因为它将比较最佳常见类型带有ExamStatusId
界面的IEnumElement
(即使您只错过elem
一个,也会收到警告。
答案 2 :(得分:0)
取决于您的目的。如果您的目的是在访问Object的成员时进行intellisense +类型检查,如下所示:
您希望在创建单个成员时进行智能感知+类型检查:
然后你所拥有的解决方案是我能想到的最好的解决方案。