用于将字符串枚举成员转换为枚举的Typescript函数

问题描述 投票:1回答:3

我想在Typescript中写这样的东西:

export function stringToEnum<T>(enumObj: T, str: string): keyof T {
    return enumObj[str];
}

并按如下方式使用:

enum MyEnum {
  Foo
}

stringToEnum<MyEnum>(MyEnum, 'Foo');

它将返回的地方

MyEnum.Foo

上面的函数按预期工作......但是输入错误。对于MyEnum中的参数stringToEnum<MyEnum>(MyEnum, 'Foo');,Typescript抱怨:

'typeof MyEnum'类型的参数不能分配给'MyEnum'类型的参数

这很有意义......不幸的是。关于如何解决这个问题的任何想法?

javascript typescript enums
3个回答
2
投票

您可以在不必编写函数的情况下完成所有操作:

enum Color {
    red,
    green,
    blue
}

// Enum to string
const redString: string = Color[Color.red];
alert(redString);

// String to enum
const str = 'red';
const redEnum: Color = Color[str];
alert(redEnum);

或者你可以玩得开心......

enum MyEnum {
  Foo,
  Bar
}

function stringToEnum<ET, T>(enumObj: ET, str: keyof ET): T{
    return enumObj[<string>str];
}

const val = stringToEnum<typeof MyEnum, MyEnum>(MyEnum, 'Foo');

// Detects that `foo` is a typo
const val2 = stringToEnum<typeof MyEnum, MyEnum>(MyEnum, 'foo');

1
投票
 stringToEnum(MyEnum, 'Foo');

只要放弃泛型,让打字稿就可以了。那是因为存储在MyEnum下的类型与Enum本身不匹配,但是它的值的联合类型:

 enum Test { A, B };

 const value: Test /* "A" | "B" */ = Test.A;

0
投票

你的签名有点混乱。如果您打算让方法返回枚举值,则返回类型应为T[keyof T]str param的类型也应该是keyof T以防止你传入无效的字符串,但是这将限制你传递字符串文字(或keyof T类型的良好类型变量,但不是string):

function stringToEnum<T>(enumObj: T, str: keyof T): T[keyof T]

然后要么不指定类型参数,要让编译器正确推断类型:

// type: Foo
// value: 0  
const result = stringToEnum(MyEnum, 'Foo');

或者你需要提供typeof MyEnum作为类型参数:

// type: Foo
// value: 0  
const result = stringToEnum<typeof MyEnum>(MyEnum, 'Foo');

如果你真的希望能够传入任意字符串枚举名,那么返回类型就是谎言:应该是T[keyof T] | undefined。如果enumObj[str]的类型是str并且启用了string编译器选项,那么在尝试noImplicitAny时也会遇到麻烦。

制作适用于枚举类型的通用函数还有一些功能,尤其是在运行时具有反向查找条目的数字枚举。看一下ts-enum-utilgithubnpm)源代码的灵感来源

© www.soinside.com 2019 - 2024. All rights reserved.