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

时间:2017-06-07 02:58:58

标签: typescript ngrx ngrx-store

我正在尝试使用@ngrx和Angular使用TypeScript在我的reducer上使用Object Spread,但是,我一直在控制台中收到此错误:

  

ReferenceError:未定义__assign

这是我的代码:

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

但如果我按照下面的代码执行,我可以正常运行代码:

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

我在another question中读到这可能与打字稿版本有关,但我正在使用"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"
    ]
}

1 个答案:

答案 0 :(得分:3)

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

默认情况下,此辅助函数将包含在相关的任何位置。这可能会略微夸大生成的输出,因为即使生成的输出要使用单个全局源,这些辅助函数也会被多次包含。打字稿团队提供了不在源代码旁边发布这些辅助函数的选项,因此用户不会有额外的大小,并且可以在全局或适当时自己包含这些函数。 Recently they introduced tslib as a better solution。这是一个可以包含的外部库,它将提供帮助程序功能,但因为它在一个地方注册为自己的程序包,所以捆绑程序只能在最终的bundle中包含它一次。

这就是我要求你的tsconfig.json的原因。您已关闭这些助手的排放,并且您正在使用ES5。你需要确保帮助器以某种方式存在。你可以:

  1. 从tsconfig
  2. 中删除noEmitHelpers: true
  3. 执行时在范围内提供_assign函数(and others
  4. 使用tslib并正确捆绑。
  5. 1是最简单的选项,是一个可以工作的两秒修复。 3是一个很好的长期解决方案。

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

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