有没有办法在
JavaScript中构造一个对象并将其作为别名的本地解构对象?
就像是:
const env = {ENV_VAR_X,ENV_VAR_Y,ENV_VAR_Z} = process.env;
…并且env成为包含所选环境变量的局部常量. (我知道我的例子不适用于babel)
{ ENV_VAR_X: "s867c7dsj4lal7",ENV_VAR_Y: "hd73m20s-a=snf77f",ENV_VAR_Z: "production" }
有没有办法实现这种混叠?
另外,我使用babel作为我的转换程序,然后使用节点运行脚本,以便我可以利用更多ECMAScript 6功能.
解决方法
根据我对规范的解读,这应该是可以解析的,但这并不意味着你的想法.它将从右到左解析为
const env = ({ENV_VAR_X,ENV_VAR_Z} = process.env);
在哪里生产
({ENV_VAR_X,ENV_VAR_Z} = process.env)
像所有其他任务一样,定义为对RHS的评估,即rHS,即process.env.
因此,您的代码相当于
const {ENV_VAR_X,ENV_VAR_Z} = process.env; const env = process.env;
验证这个很容易:
const foo = {a: 1,b: 2}; const bar = {a} = foo;
正如您所期望的那样,导致一个新的常量a被声明为值1.但是,bar的值不是“解构对象的别名”,它将是{a:1};它与foo相同,即{a:1,b:2}.吧=== foo.
您正在尝试做的事已在SO上和ES讨论组中多次讨论过.底线是没有办法做到这一点.你所能做的就是:
const {ENV_VAR_X,ENV_VAR_Z} = process.env; const env = {ENV_VAR_X,ENV_VAR_Z};
换句话说,没有办法“从一个对象解构成一个对象”,或“从一个对象中挑选一个对象”.您只能将对象解构为变量.
你可以回归过去的老式方式:
const env = {ENV_VAR_X: process.env.ENV_VAR_X,...
我知道这很可怕.
const env = _.pick(process.env,'ENV_VAR_X',"ENV_VAR_Y','ENV_VAR_Z');
这只是稍微不那么可怕了.
我们为ES7提出了“rest properties” and “spread properties”,但它们似乎对我们没有帮助.
我们需要的是一种将属性选择到另一个对象的新语法.已经提出了各种各样的建议,其中没有一个获得太多牵引力.一个是“扩展点符号”,它允许将一个卷曲括号的结构放在一个点之后.在你的情况下,你会写
const env = process.env.{ENV_VAR_X,ENV_VAR_Z}; ^^
您可以找到有关此提案here的更多信息.