根据我对规范的阅读,这应该是可解析的,但它的含义并不是你所想象的。它将从右到左解析。
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
被声明,并赋值为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, ...
我知道这很糟糕。
您可以使用underscore的pick
函数或者编写自己的函数,但这需要您明确说明。
const env = _.pick(process.env, 'ENV_VAR_X', "ENV_VAR_Y', 'ENV_VAR_Z');
这里只是稍微好一点而已。
我们在ES7中提出了"剩余属性和展开属性", 但它们似乎并没有帮助我们解决这个问题。
我们需要的是一种新的语法,用于将属性选取到另一个对象中。已经提出了各种各样的建议,但没有一项得到了很大的关注。其中之一是“扩展点表示法”,它允许在点号后面放置一个花括号结构。在您的情况下,您将编写
const env = process.env.{ENV_VAR_X, ENV_VAR_Y, ENV_VAR_Z}
^^
您可以在
这里了解更多关于这个提案的信息。