有没有更好的方法来使用打字稿模拟ENUM?

时间:2014-07-16 13:13:38

标签: typescript

我在基类/不同文件中创建类似于ENUM的东西:

ExamStatusId = {
    All: {
        elem: this.examStatusSelectId, // << refers to a string
        text: 'Exam Status: All',
        val: 0
    },
    Current: {
        elem: this.examStatusSelectId, // << refers to a string
        text: 'Exam Status: Current',
        val: 1
    }
}

一旦定义了这个,我在另一个类/文件中调用这样的函数:

page.isSelectedValue(page.ExamStatusId.All);

这是另一个类/文件中的函数:

isSelectedValue (data) {
    var title = this.getTitle(data.id);
    var valueString = data.val.toString();
    it('Check for ' + data.text, function () {
        expect(data.elem.getAttribute("value")).toBe(valueString);
    });
}

这段代码有效,但有人可以告诉我这是否是一种更好的方式让我使用Typescript将所需数据传递给isSelectedValue函数?我已经使用Typescript作为代码,并希望充分利用它提供的所有功能。

另外,我如何确保传递给该函数的函数包含elem,text和val的所有参数?

3 个答案:

答案 0 :(得分:5)

Typescript具有内置的枚举语法:

enum EnumName {
    member1,
    member2,
    member3
}

然后EnumName成为命名类型,因此您可以拥有一个函数:

((foo: EnumName) => { })(EnumName.member1);

为了满足您的具体要求,也许您可​​以这样做:

enum Status {
    All,
    Current
}
ExamStatusID = {
    elem: this.examStatusSelectId
    val: (status: Status) => {
        switch(status) {
            case Status.All: //etc
        }
    }
}

答案 1 :(得分:1)

看起来你想要类似下面的代码。 至少在我看来你看起来不是在使用枚举,而是更像是对象常量? 这可以通过额外的界面完成。关于这个的好处,你仍然在你的isSelectedValue函数中进行了类型检查!

interface IElement {
    elem: string;
    text: string;
    val: number
}
var ExamStatusId = {
    All: <IElement>{
        elem: this.examStatusSelectId, // << refers to a string
        text: 'Exam Status: All',
        val: 0
    },
    Current: <IElement>{
        elem: this.examStatusSelectId, // << refers to a string
        text: 'Exam Status: Current',
        val: 1
    }
}

function isSelectedValue (data: IElement) {
}

isSelectedValue(ExamStatusId.All);

答案 2 :(得分:0)

当获得相同的值时,

枚举有时很乏味,这就是我在这种情况下的用户

  export class urlMapper {
    //contains names of the api url's
    static homeUrl:string = '/home';
    static loginUrl:string ='/auth';
    static userUrl:string ='/user';
    static logoutUrl:string ='/logout';
    static storeUrl:string="/store";

}