如何在打字稿中定义类型"any string enum"?



我不得不根据请求将很多基于数字的枚举更改为字符串枚举,现在我需要为存储 API 中已经存储的enum值制作一个enum转换器,所以我有:

enum MyEnum {
FirstValue,
SecondValue
}

现在是

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

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

myObject = {
myEnum = 0
}

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

myObject = {
myEnum = 'FirstValue'
}

至于现在我已经有了它的逻辑,但我的函数定义有问题,我不知道如何在不向所有枚举添加索引签名的情况下定义"任何字符串枚举"。

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

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

但是如果我把它交给我的函数,我会得到错误:

类型为"类型

MyEnum"的参数不可分配给类型为"EnumToFix"的参数。 类型"MyEnum"中缺少索引签名。

我目前的函数定义是

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

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

有时,当您更好地了解对象时,只需将对象转换为未知对象,然后在目标类型中投射即可。但是您需要在"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 };

当你的意思不同时,我会问你更多细节/代码。 :)

最新更新