获取 Typescript 中命名空间的所有值?

Mik*_*rin 1 javascript enums typescript

节点版本: 6.11.3

打字稿版本: 2.1.6

我们的项目中有很多枚举,大部分看起来像这样:

export type ThingType = "thing1" | "thing2";

export namespace ThingType {
    export const THING_ONE = "thing1";
    export const THING_TWO = "thing2";
}
Run Code Online (Sandbox Code Playgroud)

我想在端点中向需要这些字符串值的端点的使用者公开这些值。所以我创建了一个如下所示的端点:

const enums = {
    thingType: ThingType,
    ...
}
Run Code Online (Sandbox Code Playgroud)

返回的 json 看起来像:

"data": {
    "thingType": {
        "THING_ONE": "thing1",
        "THING_TWO": "thing2"
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望它的输出如下:

"data": {
    "thingType": ["thing1", "thing2"]
}
Run Code Online (Sandbox Code Playgroud)

对于普通的 javascript 对象,这相当简单,我只需添加到端点values()的末尾即可。ThingTypevalues()不存在于 TS 中的命名空间或枚举上。我在 Typescript 中的命名空间文档中没有找到任何内容,但我觉得一定有一些东西可以让我轻松获取枚举值。

art*_*tem 6

命名空间被编译成普通的 javacsript 对象,因此Object.values()Object.values按预期工作(当然在支持的环境中):

export type ThingType = "thing1" | "thing2";

export namespace ThingType {
    export const THING_ONE = "thing1";
    export const THING_TWO = "thing2";
}

const enums = {
    thingType: Object.values(ThingType)

}
console.(enums);
Run Code Online (Sandbox Code Playgroud)

节目

{ thingType: ['thing1', 'thing2'] }
Run Code Online (Sandbox Code Playgroud)

如果Object.values不可用,它会变得更加冗长:

const enums = {
    thingType: Object.keys(ThingType).map(k => ThingType[k])

}
Run Code Online (Sandbox Code Playgroud)