仅强制枚举值,但确保传递字符串名称

时间:2015-04-27 01:45:40

标签: typescript typescript1.4

假设我有这些枚举和界面:

export enum IFundingMethods = {
   ONLINE_DEBIT,
   BOLETO,
   CREDIT_CARD
}

export interface IFunding {
   method: IFundingMethods;
   /* ... */
}

function send(opts: IFunding) { /*...*/ }

当调用函数send时,编译器将要求IFundMethods.ONLINE_DEBIT,BOLETO或CREDIT_CARD。因此,当使用:

调用函数时
send({method: IFundMethods.ONLINE_DEBIT});

函数收到{method: 0},如何将其转换为ONLINE_DEBIT字符串而不必对其进行类型转换?

3 个答案:

答案 0 :(得分:3)

根据TypeScript Handbook,您可以通过将Enum引用为具有索引的数组来获取Enum的字符串值。

enum IFundingMethods {
   ONLINE_DEBIT,
   BOLETO,
   CREDIT_CARD
}
class EnumHelper{
    help(base:IFundingMethods)  {
        return IFundingMethods[base]
    }
}
var test :EnumHelper = new EnumHelper();
alert(test.help(IFundingMethods.CREDIT_CARD));

更通用的解决方案

enum IFundingMethods {
   ONLINE_DEBIT,
   BOLETO,
   CREDIT_CARD
}
class Util{         
    static enumKey<T>(innerEnum:T,value:number):string{
        return innerEnum[value];
    }
}
var test = Util.enumKey(IFundingMethods,IFundingMethods.CREDIT_CARD);
alert(test);

希望这会有所帮助

答案 1 :(得分:2)

我已经看到这个被使用了。

 enum IFundingMethods {
    ONLINE_DEBIT =<any>'ONLINE_DEBIT',
    BOLETO =<any>'BOLETO',
    CREDIT_CARD =<any>'CREDIT_CARD'
}

Typescript将其编译为:

var IFundingMethods;
(function (IFundingMethods) {
    IFundingMethods[IFundingMethods["ONLINE_DEBIT"] = 'ONLINE_DEBIT'] = "ONLINE_DEBIT";
    IFundingMethods[IFundingMethods["BOLETO"] = 'BOLETO'] = "BOLETO";
    IFundingMethods[IFundingMethods["CREDIT_CARD"] = 'CREDIT_CARD'] = "CREDIT_CARD";
})(IFundingMethods || (IFundingMethods = {}));

这不是最好的代码,但会创建一个使用字符串作为值的枚举。这应该实现你暂时想要完成的目标。一旦打字稿允许更直接的方式创建字符串枚举,您可以更改为。

答案 2 :(得分:1)

  

如何将其转换为ONLINE_DEBIT字符串而不必对其进行类型转换

如果您希望编译时安全,则需要string下面的内容(枚举为numbers且所有数字都与枚举兼容)。

此处有一个请求:https://github.com/Microsoft/TypeScript/issues/1003(也称为tagged unionsstring unions)。