我正在尝试使用@ngrx上的对象扩散,并使用Typescript使用Angular,但是,我一直在控制台中遇到此错误:
参考:__ 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"
]
}
为较旧的编译目标提供未来的功能,TypeScript包含几个辅助功能以及任何需要它们的代码。靶向ES6时,对象扩展和休息可以使用Object.assign
,但是Object.assign
并不是ES5规格的一部分,因此当针对ES5打字条时,需要包括________________________。
默认情况下,此辅助功能将包含在其相关的任何地方。这可能会稍微膨胀生成的输出,因为即使生成的输出想使用单个全局源,这些辅助功能也会多次包含。打字稿团队提供了不与源代码一起发射这些助手功能的选项,以便用户没有额外的尺寸,并且可以在全球或适当的情况下包含这些功能。最近,他们引入了TSLIB作为更好的解决方案。您可以包括一个外部库,它将提供辅助功能,但由于它是其自己的包裹,在一个地方捆绑包中只能将其包含在最终捆绑包中一次。
这就是为什么我要求您的tsconfig.json。您已关闭这些帮助者的排放,并且正在使用ES5。您将需要确保在某种程度上有助手。您可以:
- 从tsconfig删除
noEmitHelpers: true
线 - 在执行时,在范围内提供_assign函数(和其他(
- 使用tslib并正确捆绑。
1是最简单的选项,是将有效的两秒钟修复程序。3是一个很好的长期解决方案。
我会说选择选项1,除非您有很好的理由不这样做。如果您的捆绑包大小受助手的影响或您想要的影响,则选项3很好。选项2是两全其最差的,并且由于您有3个,因此是多余的。
您可以保留noEmitHelpers: true
,但应包括importHelpers: true
。