不能将 Object Spread 与 TypeScript 和 @ngrx 一起使用

Can't use Object Spread with TypeScript and @ngrx

我正在尝试使用@ngrx 在我的减速器上使用 Object Spread 并使用 TypeScript Angular,但是,我在控制台中不断收到此错误:

ReferenceError: __assign is not defined

这是我的代码:

case INCREMENT: {
    return state = {
        ...state,
        counter: state.counter++
    }
}

但是如果我按照下面的代码做,我可以运行代码就好了:

case INCREMENT: {
    return Object.assign({}, state, {
        counter: state.counter++
    }
}

我在 中了解到这可能与 typescript 版本有关,但我正在使用 "typescript": "~2.2.1"

我是不是漏掉了什么?


编辑:

根据评论中的要求添加 tsconfig.js。

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "noEmitHelpers": true,
        "noEmitOnError": true,
        "lib": [
            "es6",
            "dom",
            "es2015.iterable"
        ],
        "baseUrl": ".",
        "paths": {
            "*": [
                "./node_modules/tns-core-modules/*",
                "./node_modules/*"
            ]
        }
    },
    "exclude": [
        "node_modules",
        "platforms",
        "**/*.aot.ts"
    ]
}

为了向旧的编译目标提供未来的功能,Typescript 包括几个辅助函数以及需要它们的任何代码。 Object spread and rest 可以在针对 ES6 时使用 Object.assign,但 Object.assign 不是 ES5 规范的一部分,因此当针对 ES5 时,typescript 需要包含一个 __assign 辅助函数。

默认情况下,此辅助函数将包含在与其相关的任何位置。这可能会稍微增加生成的输出,因为即使生成的输出想要使用单个全局源,这些辅助函数也会被多次包含。 typescript 团队提供了不将这些辅助函数与源代码一起发出的选项,这样用户就不会拥有额外的大小,并且可以在全局范围内或在适当的时候自己包含这些函数。 Recently they introduced tslib as a better solution。这是一个您可以包含的外部库,它将提供辅助函数,但因为它在一个地方注册为自己的包,所以打包器只能在最终包中包含一次。

这就是我要你 tsconfig.json 的原因。你已经关闭了这些助手的发射并且你正在使用 ES5。您将需要确保助手以某种方式在那里。您可以:

  1. 从 tsconfig
  2. 中删除 noEmitHelpers: true
  3. 执行时在scope中提供_assign函数(and others)
  4. 使用 tslib 并正确捆绑。

1 是最简单的选项,只需两秒钟即可完成修复。 3 是一个很好的长期解决方案。

我会说选择选项 1,除非你有充分的理由不这样做。如果您的包大小受到助手的影响或者您想要,选项 3 是好的。选项 2 是两个世界中最糟糕的,并且是多余的,因为你有 3 个。

您可以保留 noEmitHelpers: true,但您应该包括 importHelpers: true