【问题标题】:How to import a map defined in an external json file?如何导入在外部 json 文件中定义的地图?
【发布时间】:2019-08-29 22:02:10
【问题描述】:

我有以下包含配置的 json 文件:

{
   "config1": { //this would be a map
      "a": [ "string1", "string2"],
      "b": [ "string1", "string2"]
   }
}

在迁移到打字稿之前,以下工作:

import * as myConfig from './config.json';
...
myConfig.config1[this.state.section]; //section would be either "a" or "b"

现在代码给了我:

元素隐含地具有“任何”类型,因为 blablabla 没有索引签名

请注意,我确保在我的 tsconfig 文件中设置了以下内容:

"esModuleInterop": true,
"resolveJsonModule": true,

但它仍然不起作用。 我错过了什么?

编辑:

这似乎与运行时验证有关,以下似乎很好:

myConfig.config1["a"]; //alright!

但这不是:

const name:string = "a";
myConfig.config1[name]; //NOT!

不管我需要传递一个变量..我该怎么做? :(

【问题讨论】:

  • 为了使括号符号在您的配置中起作用,请定义一个索引签名,如interface IData { [ key: string ]: object; } 您可以阅读更多关于它的信息typescriptlang.org/docs/handbook/…

标签: json reactjs typescript


【解决方案1】:

您不再需要星号。启动 Typescript 2.9(我可能会对特定版本感到困惑)你可以这样做 import myConfig from './config.json';

如果你仍然有这个问题,我猜你的配置文件没有 typedef,所以 typescript transpiler 无法获取导入对象的结构。

  • 在项目的src 文件夹中创建@types 目录
  • @types 内部创建myConfig.d.ts
  • myConfig.d.ts 中定义配置文件的结构,例如:
declare module "myConfig.json" {
   const config: object;
   export default config;
}

为了使“括号表示法”正常工作,您的配置类型应该定义一个索引签名,如:

interface IConfig {
    [ key: string ]: object;
}

您可以阅读更多关于它的信息https://www.typescriptlang.org/docs/handbook/interfaces.html#indexable-types

【讨论】:

  • 你的意思是在“src”文件夹里面?
  • 不起作用:问题在于使用变量来引用键,请参阅编辑:(
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2012-05-27
  • 1970-01-01
  • 2017-03-14
相关资源
最近更新 更多