【问题标题】:"__assign is not defined" - NativeScript Object Spread Woes“__assign 未定义” - NativeScript 对象传播问题
【发布时间】:2017-07-04 23:52:38
【问题描述】:

在发生这种情况之前,我在本机脚本项目上取得了不错的进展:

JS: EXCEPTION: Uncaught (in promise): ReferenceError: __assign is not defined

这是从这行代码冒出来的:

return [...state, { ...action.payload, success: false }];

这是我的tsconfig.json

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "noEmitHelpers": true,
        "noEmitOnError": true
    },
    "exclude": [
        "node_modules",
        "platforms",
        "**/*.aot.ts"
    ]
}

Typescript 似乎没有在编译的源代码中包含它的帮助器 __assign 函数——这是他们实现对象扩展语法的方式。你们当中有没有人碰巧知道为什么?

【问题讨论】:

    标签: typescript nativescript spread-syntax


    【解决方案1】:

    我很高兴报告我找到了解决方案。这个GitHub repo 很好地解释了事情,但这里有一个简短的介绍:

    tsconfig.json 中的标志 noEmitHelpers 告诉 Typescript 在每个需要它们的文件中省略这些“助手”(例如 __assign)。

    {
      "compilerOptions": {
        // changing this to false does the job, but duplicates helpers across every file
        "noEmitHelpers": false
      }
    }
    

    最新的 Typescript 提供了一种更好的方法来管理这个问题,使用标志 importHelpers(参见 compiler options):

    {
      "compilerOptions": {
        "noEmitHelpers": true,
        "importHelpers": true // better
      }
    }
    

    这将使对象传播工作,并避免跨文件的代码重复。

    您可能还需要npm install tslib --save 来停止 IDE 错误。

    【讨论】:

    • 你知道改成 es6 吗?你能告诉我们整个 tsconfig 吗?
    • 应该没必要改成es6。对象传播在 es5 中很容易实现。
    • 澄清这一点,因为您的评论对我来说似乎有点误导:对象传播是 es6/es2015 功能。但是由于 tsconfig 中的目标定义了输出,而不是输入,所以没关系。重要的是,您在 tsconfig 的 library 属性中定义了哪些库。就我而言,我必须在我的 references.d.ts 中添加“es6”和正确的输入参考。
    【解决方案2】:

    您是否尝试将 "lib": "es6" 添加到您的 tsconfig 中?

    【讨论】:

    • 那个标志给我带来了很多编译时错误:node_modules/@angular/platform-browser/src/browser/browser_adapter.d.ts(14,16): error TS2304: Cannot find name 'Node'.
    • 听起来你也想要 DOM 库 - "lib": ["es6", "dom"]
    • 我确实尝试了"lib" 标志的一些变体。 Nativescript 似乎不喜欢其中任何一个(至少我使用的种子项目)。我相当确定您不需要任何标志来包含__assign - 打字稿游乐场非常高兴地生成它。这是模块系统的问题——我想为每个需要它的文件生成__assign 是没有意义的——只为编译输出生成一个。不知道这是如何渗透到本机脚本的。
    • 需要看到你的完整项目才能更有帮助。可以链接到 GitHub 吗?
    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 2018-10-18
    • 2019-04-07
    相关资源
    最近更新 更多