无法将 Object Spread 与 TypeScript 和 @ngrx 一起使用

cel*_*ade 1 typescript ngrx ngrx-store

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

引用错误:__assign 未定义

这是我的代码:

case INCREMENT: {
    return state = {
        ...state,
        counter: state.counter++
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果我按照下面的代码执行,我可以很好地运行代码:

case INCREMENT: {
    return Object.assign({}, state, {
        counter: state.counter++
    }
}
Run Code Online (Sandbox Code Playgroud)

我在另一个问题中读到这可能与打字稿版本有关,但我正在使用"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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

Paa*_*rth 5

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

默认情况下,此辅助函数将包含在其相关的任何位置。这可能会稍微夸大生成的输出,因为即使生成的输出想要使用单个全局源,这些辅助函数也会被多次包含。Typescript 团队提供了不与源代码一起发布这些辅助函数的选项,这样用户就不会拥有额外的大小,并且可以全局或在适当的时候包含这些函数。最近他们推出了 tslib 作为更好的解决方案。这是一个您可以包含的外部库,它将提供帮助器函数,但因为它在一个地方注册为自己的包,所以捆绑器只能在最终包中包含它一次。

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

  1. noEmitHelpers: true从 tsconfig 中删除该行
  2. 在执行时在作用域内提供 _assign 函数(和其他函数)
  3. 使用tslib并正确捆绑它。

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

我建议选择选项 1,除非你有充分的理由不这样做。如果您的捆绑包大小受到助手的影响或者您愿意,选项 3 是不错的选择。选项 2 是两全其美的,而且是多余的,因为你有 3 个选项。

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