假设我有这些枚举和界面:
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
字符串而不必对其进行类型转换?
答案 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 unions
或string unions
)。