Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点类型脚本:使用括号表示法时未定义JSON_Javascript_Node.js_Json_Typescript_Aws Lambda - Fatal编程技术网

Javascript 节点类型脚本:使用括号表示法时未定义JSON

Javascript 节点类型脚本:使用括号表示法时未定义JSON,javascript,node.js,json,typescript,aws-lambda,Javascript,Node.js,Json,Typescript,Aws Lambda,我有一个带有typescript的节点项目,我正在尝试从json对象读取正确的url。 然而,当使用方括号表示法时,我没有定义 { "env":"dev", "dev":{ "url": "url1" }, "aws":{ "url": "url2" } } 由于某些原因,这不起作用: const url = config[config.env].url; 下面的代码满足了我的需要,但它没有上面的那么灵活,我想理解为什么

我有一个带有typescript的节点项目,我正在尝试从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';

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


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

我建议创建
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"
    }
}
你可以测试一下