Javascript 节点类型脚本:使用括号表示法时未定义JSON
我有一个带有typescript的节点项目,我正在尝试从json对象读取正确的url。 然而,当使用方括号表示法时,我没有定义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; 下面的代码满足了我的需要,但它没有上面的那么灵活,我想理解为什么
{
"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"
}
}
你可以测试一下