根据我对规范的阅读,这应该是可解析的,但这并不意味着您的想法。它将从右到左解析为
const env = ({ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env);
哪里生产
({ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env)
与所有其他赋值一样,被定义为对 RHS 求值,即process.env
。
因此,您的代码等效于
const {ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env;
const env = process.env;
验证这一点很容易:
const foo = {a: 1, b: 2};
const bar = {a} = foo;
正如您所期望的那样,会a
使用 value 声明一个新常量1
。然而,该值bar
是不是一个“别名解构对象”,这将是{a: 1}
; 它与 相同foo
,即{a: 1, b: 2}
。bar === foo
.
您正在尝试做的事情已经在 SO 和 ES 讨论组中多次讨论过。最重要的是,没有办法做到这一点。你所能做的就是:
const {ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z} = process.env;
const env = {ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z};
换句话说,没有办法“从一个对象解构到一个对象”,或者“从一个对象中挑选一个对象”。您只能将对象解构为变量。
你可以回到老式的方式:
const env = {ENV_VAR_X: process.env.ENV_VAR_X, ...
我知道这很可怕。
您可以使用pick
下划线中的函数或编写自己的函数,但这需要您说
const env = _.pick(process.env, 'ENV_VAR_X', "ENV_VAR_Y', 'ENV_VAR_Z');
这只是稍微不那么可怕。
我们为 ES7 提出了“rest 属性”和“spread 属性”,但它们似乎对我们没有帮助。
我们需要的是一种新的语法,用于将属性挑选到另一个对象中。已经为此提出了各种建议,但没有一个得到了很大的关注。一种是“扩展点符号”,它允许在点之后放置一个花括号结构。在你的情况下,你会写
const env = process.env.{ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z};
^^
您可以在此处了解有关此提案的更多信息。