我正在尝试使用@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"
]
}
答案 0 :(得分:3)
为较旧的编译目标提供未来功能Typescript包含几个辅助函数以及需要它们的任何代码。在针对ES6时,对象传播和休息可以使用Object.assign
,但Object.assign
不是ES5规范的一部分,因此在定位ES5打字稿时需要包含__assign辅助函数。
默认情况下,此辅助函数将包含在相关的任何位置。这可能会略微夸大生成的输出,因为即使生成的输出要使用单个全局源,这些辅助函数也会被多次包含。打字稿团队提供了不在源代码旁边发布这些辅助函数的选项,因此用户不会有额外的大小,并且可以在全局或适当时自己包含这些函数。 Recently they introduced tslib as a better solution。这是一个可以包含的外部库,它将提供帮助程序功能,但因为它在一个地方注册为自己的程序包,所以捆绑程序只能在最终的bundle中包含它一次。
这就是我要求你的tsconfig.json的原因。您已关闭这些助手的排放,并且您正在使用ES5。你需要确保帮助器以某种方式存在。你可以:
noEmitHelpers: true
行
1是最简单的选项,是一个可以工作的两秒修复。 3是一个很好的长期解决方案。
我会说选择1,除非你有充分的理由不这样做。如果您的包大小受到帮助者或您想要的影响,则选项3是好的。选项2是两个世界中最糟糕的,因为你有3个,所以是多余的。
您可以保留noEmitHelpers: true
,但应该包含importHelpers: true
。