节点打字稿:使用方括号表示法时,JSON未定义

时间:2019-10-23 17:35:28

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

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

2 个答案:

答案 0 :(得分:1)

之所以不起作用,是因为Typescript推断env的值为string类型,这意味着它可以是任何字符串值。您在检查typeof config时会看到以下内容:

enter image description here

因为打字稿认为env可以是任何字符串值,所以会引发错误。例如,如果您编译此代码,然后将env的值更改为“ foobar”,将会发生什么情况?代码会抛出,而Typescript会阻止您这样做。

答案 1 :(得分:1)

我建议创建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对其进行测试。