【问题标题】:Node Typescript: JSON undefined when using bracket notation节点打字稿:使用括号表示法时未定义 JSON
【发布时间】:2020-02-20 00:26:41
【问题描述】:

我有一个带有打字稿的节点项目,我正在尝试从 json 对象中读取正确的 url。 但是,当使用方括号表示法时,我得到未定义。

{
    "env":"dev",
    "dev":{
        "url": "url1"
    },
    "aws":{
        "url": "url2"
    }
}

由于某种原因,这不起作用:

const url = config[config.env].url;

下面的代码完成了我所需要的,但它不像上面那样灵活,我想了解为什么它不能以其他方式工作。

const cenv:string = config.env;
    let url=null;
    if( cenv === "dev")
        url = config["dev"].url;
    else
        url = config["aws"].url;

这是我的 tsconfig 文件:

{
  "compilerOptions": {
    "lib": [
      "es2017"
    ],
    "moduleResolution": "node",
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "sourceMap": true,
    "target": "es2017",
    "outDir": "lib",
    "resolveJsonModule": true
  },
  "exclude": [
    "node_modules"
  ]
}

json 像这样导入到项目中:

import * as config from './config.json';

【问题讨论】:

    标签: javascript node.js json typescript aws-lambda


    【解决方案1】:

    这不起作用的原因是因为 Typescript 将 env 的值推断为 string 类型,这意味着它可以是任何字符串值。检查typeof config时可以看到这一点:

    因为 Typescript 认为 env 可以是任何字符串值,所以会抛出错误。例如,如果您编译了此代码,但随后将 env 值更改为“foobar”,会发生什么情况?代码会抛出,Typescript 会为您提供保护。

    【讨论】:

      【解决方案2】:

      我建议创建config 文件夹

      config/
        settings.dev.json
        settings.prod.json
        index.js
      
      // index.js
      module.exports = function(){
          switch(process.env.NODE_ENV){
              case 'development':
                  return require('./settings.dev.json');
      
              case 'production':
                  return require('./settings.prod.json');
      
              default:
                  return {error or other settings};
          }
      };
      

      如果你想使用方法,你可以这样做:

      enum Enivornment {
        Dev = "dev",
        Aws = "aws"
      }
      
      type Config = {
        "env": Enivornment,
      } & {
        [key in Enivornment]: ConfigItem
      }
      
      // this will help you have all environments in sync
      type ConfigItem = {
        "url": string
      } 
      
      const config: Config = {
          "env": Enivornment.Dev,
          [Enivornment.Dev]: {
              "url": "url1"
          },
          [Enivornment.Aws]:{
              "url": "url2"
          }
      }
      

      你可以测试一下here

      【讨论】:

        猜你喜欢
        • 2020-09-26
        • 1970-01-01
        • 2023-03-07
        • 2020-09-28
        • 2022-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多