如何在打字稿中解构枚举值?
How to de-structure an enum values in typescript?
我在打字稿中有一个枚举,如下所示:
export enum XMPPElementName {
state = "state",
presence = "presence",
iq = "iq",
unreadCount = "uc",
otherUserUnreadCount = "ouc",
sequenceID = "si",
lastSequenceID = "lsi",
timeStamp = "t",
body = "body",
message = "message"
}
想要解构它的价值,我们如何在 Typescript 中做到这一点?
const { uc, ouc, msg, lsi, si, t, body } = XMPPElementName;
更新
作为@amadan , we can use Assigning to new variable names
as in Mozilla doc say ,如下所示:
正在分配给新的变量名
A 属性 可以从对象中解包并分配给名称与对象 属性 不同的变量。
const o = {p: 42, q: true};
const {p: foo, q: bar} = o;
console.log(foo); // 42
console.log(bar); // true
并且该方法很好地解决了这个问题,但是如果您需要访问所有项目而不需要显式定义它们,您可以选择这两个中的任何一个
我们知道,在打字稿中,枚举就像一个普通的旧 javascript 对象(at-least 操场 js-output 正在显示或日志显示的内容):
一种方法是使用生成具有如下 {value:value}
结构的新对象的函数:
export function convertEnumValuesToObject<T>(enumObj: T): { [index: string]: T[keyof T] } {
const enum_values = Object.values(enumObj);
return Object.assign({}, ...enum_values.map(_ => ({ [_]: _ })));
}
const { uc, ouc, msg, lsi, si, t, body } = convertEnumValuesToObject(
XMPPElementName
);
如果能在打字稿中看到答案就好了?
您需要枚举 value-to-value 地图。就像你说的 JS 中的枚举只是一个 POJO。您可以创建一个实用程序类型来帮助生成正确的类型。
type EnumValueMap<T extends { [k: string]: string }> = { [K in T[keyof T]]: K }
function convertEnumValuesToObject<T extends { [k: string]: string }>(enumerable: T): EnumValueMap<T> {
return (Object as any).fromEntries(Object.values(enumerable).map(v => [v, v]))
}
const { uc, ouc, msg, lsi, si, t, body } = XMPPElementName;
这是行不通的,因为 XMPPElementName
没有名为 uc
的元素(其他元素也一样)。如果您明确命名您的密钥,它将起作用:
const {
unreadCount: uc,
otherUserUnreadCount: ouc,
message: msg,
lastSequenceID: lsi,
sequenceID: si,
timeStamp: t,
body: body,
} = XMPPElementName;
它会起作用的。或者,您可以只使用名称等于键的变量,而不是值:
const {
unreadCount,
otherUserUnreadCount,
message,
lastSequenceID,
sequenceID,
timeStamp,
body,
} = XMPPElementName;
这可能对任何寻求快速简单答案的人有所帮助 - 是的(至少现在是这样)。据我所知,这适用于有和没有指定值的枚举。
enum MyEnum {
One,
Two,
Three
}
const { One, Two, Three } = myEnum;
console.log({ One, Two, Three }) // {One: 0, Two: 1, Three: 2}
enum Status {
None = '',
Created = 'CREATED',
Completed = 'COMPLETED',
Failed = 'FAILED',
}
const { None, Created, Completed, Failed } = Status;
console.log(None, Created, Completed, Failed) // '', 'CREATED', 'COMPLETED, 'FAILED'
如果我错了或者您在测试自己时发现任何奇怪的地方,请给我回信。
我在打字稿中有一个枚举,如下所示:
export enum XMPPElementName {
state = "state",
presence = "presence",
iq = "iq",
unreadCount = "uc",
otherUserUnreadCount = "ouc",
sequenceID = "si",
lastSequenceID = "lsi",
timeStamp = "t",
body = "body",
message = "message"
}
想要解构它的价值,我们如何在 Typescript 中做到这一点?
const { uc, ouc, msg, lsi, si, t, body } = XMPPElementName;
更新
作为@amadan Assigning to new variable names
as in Mozilla doc say
正在分配给新的变量名
A 属性 可以从对象中解包并分配给名称与对象 属性 不同的变量。
const o = {p: 42, q: true};
const {p: foo, q: bar} = o;
console.log(foo); // 42
console.log(bar); // true
并且该方法很好地解决了这个问题,但是如果您需要访问所有项目而不需要显式定义它们,您可以选择这两个中的任何一个
我们知道,在打字稿中,枚举就像一个普通的旧 javascript 对象(at-least 操场 js-output 正在显示或日志显示的内容):
一种方法是使用生成具有如下 {value:value}
结构的新对象的函数:
export function convertEnumValuesToObject<T>(enumObj: T): { [index: string]: T[keyof T] } {
const enum_values = Object.values(enumObj);
return Object.assign({}, ...enum_values.map(_ => ({ [_]: _ })));
}
const { uc, ouc, msg, lsi, si, t, body } = convertEnumValuesToObject(
XMPPElementName
);
如果能在打字稿中看到答案就好了?
您需要枚举 value-to-value 地图。就像你说的 JS 中的枚举只是一个 POJO。您可以创建一个实用程序类型来帮助生成正确的类型。
type EnumValueMap<T extends { [k: string]: string }> = { [K in T[keyof T]]: K }
function convertEnumValuesToObject<T extends { [k: string]: string }>(enumerable: T): EnumValueMap<T> {
return (Object as any).fromEntries(Object.values(enumerable).map(v => [v, v]))
}
const { uc, ouc, msg, lsi, si, t, body } = XMPPElementName;
这是行不通的,因为 XMPPElementName
没有名为 uc
的元素(其他元素也一样)。如果您明确命名您的密钥,它将起作用:
const {
unreadCount: uc,
otherUserUnreadCount: ouc,
message: msg,
lastSequenceID: lsi,
sequenceID: si,
timeStamp: t,
body: body,
} = XMPPElementName;
它会起作用的。或者,您可以只使用名称等于键的变量,而不是值:
const {
unreadCount,
otherUserUnreadCount,
message,
lastSequenceID,
sequenceID,
timeStamp,
body,
} = XMPPElementName;
这可能对任何寻求快速简单答案的人有所帮助 - 是的(至少现在是这样)。据我所知,这适用于有和没有指定值的枚举。
enum MyEnum {
One,
Two,
Three
}
const { One, Two, Three } = myEnum;
console.log({ One, Two, Three }) // {One: 0, Two: 1, Three: 2}
enum Status {
None = '',
Created = 'CREATED',
Completed = 'COMPLETED',
Failed = 'FAILED',
}
const { None, Created, Completed, Failed } = Status;
console.log(None, Created, Completed, Failed) // '', 'CREATED', 'COMPLETED, 'FAILED'
如果我错了或者您在测试自己时发现任何奇怪的地方,请给我回信。