仅强制枚举值,但确保传递字符串名称
Force only enum values, but ensure the string name is passed
假设我有这些枚举和接口:
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
字符串而无需对其进行类型转换?
how can I make it transform to ONLINE_DEBIT string without having to typecast it
如果你想要编译时安全,你需要下面的东西 string
(枚举是 numbers
并且所有数字都与枚举兼容)。
这里有一个请求:https://github.com/Microsoft/TypeScript/issues/1003(也称为 tagged unions
或 string unions
)。
根据TypeScript Handbook,您可以通过将枚举作为具有其索引的数组来引用枚举来获取枚举的字符串值。
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);
希望这对您有所帮助
我看到有人在用这个。
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 = {}));
这不是最好的代码,但创建了一个使用字符串作为值的枚举。这应该可以实现您暂时想要实现的目标。一旦打字稿允许更直接的方式来创建字符串枚举,您就可以更改为该方式。
假设我有这些枚举和接口:
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
字符串而无需对其进行类型转换?
how can I make it transform to ONLINE_DEBIT string without having to typecast it
如果你想要编译时安全,你需要下面的东西 string
(枚举是 numbers
并且所有数字都与枚举兼容)。
这里有一个请求:https://github.com/Microsoft/TypeScript/issues/1003(也称为 tagged unions
或 string unions
)。
根据TypeScript Handbook,您可以通过将枚举作为具有其索引的数组来引用枚举来获取枚举的字符串值。
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);
希望这对您有所帮助
我看到有人在用这个。
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 = {}));
这不是最好的代码,但创建了一个使用字符串作为值的枚举。这应该可以实现您暂时想要实现的目标。一旦打字稿允许更直接的方式来创建字符串枚举,您就可以更改为该方式。