1

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

ReferenceError: __assign 未定义

这是我的代码:

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

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

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

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

1 回答 1

4

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

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

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

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

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

我会说选择选项 1,除非你有充分的理由不这样做。如果您的包大小受到帮助程序的影响或您想要,选项 3 很好。选项 2 是两全其美的,因为你有 3,所以是多余的。

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

于 2017-06-10T07:39:19.253 回答