我有一个带有打字稿的节点项目,我正在尝试从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';
答案 0 :(得分:1)
之所以不起作用,是因为Typescript推断env
的值为string
类型,这意味着它可以是任何字符串值。您在检查typeof config
时会看到以下内容:
因为打字稿认为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对其进行测试。