不能将对象跨页与 TypeScript 一起使用,@ngrx



我正在尝试使用@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。您将需要确保在某种程度上有助手。您可以:

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

1是最简单的选项,是将有效的两秒钟修复程序。3是一个很好的长期解决方案。

我会说选择选项1,除非您有很好的理由不这样做。如果您的捆绑包大小受助手的影响或您想要的影响,则选项3很好。选项2是两全其最差的,并且由于您有3个,因此是多余的。

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

最新更新