如何在打字稿中定义类型“任何字符串枚举”?

时间:2019-12-22 19:38:34

标签: typescript

我不得不将每个请求的很多基于枚举的枚举更改为字符串枚举,现在我需要为存储API中已经存储的enum值创建一个enum转换器,所以我必须:

enum MyEnum {
  FirstValue,
  SecondValue
}

现在是

enum MyEnum {
  FirstValue = "FirstValue",
  SecondValue = "SecondValue"
}

并恢复一些存储的对象,如

myObject = {
  myEnum = 0
}

我必须将其恢复并再次存储为:

myObject = {
  myEnum = 'FirstValue'
}

就目前而言,我已经有了逻辑,但是我的函数定义存在问题,我不知道如何定义“任何字符串枚举” 而不向我的所有对象添加索引签名枚举。

我试图使用带有索引签名的接口

interface EnumToFix {
  [key: string]: string;
}

但是如果我将其提供给函数,则会出现错误:

  

'typeof MyEnum'类型的参数不能分配给'EnumToFix'类型的参数。         “ typeof MyEnum”类型缺少索引签名。

我当前的函数定义是

private async fixGeneral<T>(storageKey: StorageKeyItems, enumToFix: EnumToFix, objectKeyToFix: keyof T): Promise<void>

如果我忽略@ts-ignore的错误,它将按预期工作。

1 个答案:

答案 0 :(得分:0)

有时候,可以将对象转换为未知对象,然后再按目标类型,当您知道更好时,就可以了。但是您需要在“ fixGeneral”函数中提供逻辑,以正确转换myObject。因此,您可以执行以下操作:

enum MyEnum {
    FirstValue = "FirstValue",
    SecondValue = "SecondValue"
  }

let myObject: { myEnum: string | number } = { myEnum: 0 };

for (const propName of Object.keys(myObject)) 
    if (typeof myObject[propName] === "number") 
        myObject[propName] = MyEnum[myObject[propName]];

let myObjectTyped = myObject as unknown as { myEnum: MyEnum };

如果您的意思有所不同,我会请您提供更多详细信息/代码。 :)