我可以一次为对象的每个属性定义一个接口吗?

时间:2014-07-16 17:20:06

标签: typescript

这是我的属性,其中多次定义接口:

    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的每个属性之后指定接口?

3 个答案:

答案 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 +类型检查,如下所示:

enter image description here

您希望在创建单个成员时进行智能感知+类型检查:

enter image description here

然后你所拥有的解决方案是我能想到的最好的解决方案。