【问题标题】:TypeScript enum from JSON file nested array?JSON文件嵌套数组中的TypeScript枚举?
【发布时间】:2021-01-15 22:27:09
【问题描述】:

我的项目中有一个 JSON 配置文件,如下所示:

{
  "countries": {
    "ca": [
      "en-CA",
      "fr-CA"
    ],
    "us": [
      "en-US"
    ]
  }
}

我想为所有语言环境创建一个 TS 枚举,例如:

import config from './config.json'

const locales = Object.values(config.countries).map(locales => locales).flat()

type Locales = typeof locales

但是,这(或任何类似的)不起作用,因为 TS 不知道 config.countries[0] 的实际值 - 它只是将它们表示为 stringstring[]

这种事情可能吗,还是我们需要手动维护重复?

【问题讨论】:

  • 这能解决您的问题还是您还需要更多信息?
  • .map(locales => locales) 毫无意义

标签: javascript node.js reactjs typescript


【解决方案1】:

您不能动态生成枚举,但您可以指定该对象是一个 const,这样当您将鼠标悬停在您的 const locales 上时,您可以从代码中复制粘贴类型。只需添加:

const config = {
  countries: {
    ca: ["en-CA", "fr-CA"],
    us: ["en-US"]
  }
} as const; <---------- this guy

const locales = Object.values(config.countries).flat();

这样至少你有东西要复制

但如果我说你不能从代码中生成枚举,那我就是在撒谎。只是你需要稍微改变一下心态。

您总是可以想象您的部分代码依赖于单一的事实来源。然后在安装依赖项后进行代码生成步骤(这将节省您在大型项目中编写大量样板文件和重复代码)。

然后添加一些脚本来读取特定文件并为您的项目生成打字稿。最好的库是 ts-morph,它在 TypeScript Compiler API 之上提供了很好的语法糖。

我在another SO question 上给出了与此类似的示例(与您的问题相反)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多