使用 SystemJS 的混合 AngularJS/Angular 应用程序中的 Lodash。我可以单独分配'_'吗?

Posted

技术标签:

【中文标题】使用 SystemJS 的混合 AngularJS/Angular 应用程序中的 Lodash。我可以单独分配\'_\'吗?【英文标题】:Lodash in hybrid AngularJS/Angular app using SystemJS. Can I separately assign '_'?使用 SystemJS 的混合 AngularJS/Angular 应用程序中的 Lodash。我可以单独分配'_'吗? 【发布时间】:2018-06-14 18:12:54 【问题描述】:

我有一个使用 TypeScript 用 AngularJS 编写的混合应用程序,我最近将其转换为混合应用程序,以便在项目中也可以使用 Angular。我正在使用 SystemJS 进行模块加载。

转换后,我在 VS2015 中收到与 Lodash 相关的错误提示

'Cannot find name '_'

我查看了以下 SO 问题,但是没有一个建议的解决方案有效或看起来令人满意:

Importing lodash into angular2 + typescript application

Angular2 and lodash...Cannot find name

我尝试了上面第一个问题的主要建议,即:

删除节点模块文件夹,然后:

$ npm install --save lodash
$ npm install --save @types/lodash

Then, in my .ts file, I add this:

import * as _ from "lodash";

但这给了我错误'找不到模块'lodash'。

如果我使用以下内容,我不会收到该错误,但我仍然收到错误“找不到名称'_':

import "lodash";

我的问题是——现在有没有办法可以在我的代码中单独分配“_”来解决这个问题? (我真的想完全理解使用 import * as _ from "lodash" 的问题,即模块加载和'_'分配的细节是什么)

这是我得到错误的 *.ts 文件:

import "lodash";

(function () 

var controller = function ( dependency1, dependency2) 

    this.myFunction = (myParam) => 

        this.MyService.getMyModel(myParam).then((model) => 
            this.model = model.Content;

            // can I assign _ so that it works here - if so where and how?
            _.each(this.model.MyEntities, function (m)  return m.showDetails = false; );
....

我的相关 tsconfig.json 编译器选项是:

  "compilerOptions": 
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "lib": [ "es2015", "dom" ]
    ....

当我查看 C:\Program Files (x86)\Microsoft SDKs\TypeScript 时,我只有 1.8。当我咕哝这个项目(它使用https://www.npmjs.com/package/grunt-ts)时,它告诉我它正在使用我不理解的 tsc v2.6.2 进行编译。我认为VS2015必须使用tsc 1.8(我只有一个tsconfig.json,.csproj上没有Typescript配置)。

【问题讨论】:

【参考方案1】:

对于 Visual Studio 在 TypeScript 1.8 上的问题,您需要下载新版本的 Visual Studio 的 TypeScript 插件。

您可以在 typescript website download page 上找到 Visual Studio 2015 和 2017 的详细信息

关于 lodash 问题,我遇到了类似的问题。对我来说,原因是 lodash 的导入方式存在不一致。当所有代码更改为引用 lodash 时,一切正常:

import * as _ from "lodash";

在我的例子中,所有代码都包括删除一个以不同方式引用 loadash 的第 3 方组件。我确实调试并找出了实际原因,但现在我不记得除了有效的解决方案之外的细节。

【讨论】:

谢谢,我的问题是版本不匹配,我知道 ts 2.6.2 不适用于 VS2015。再次查看您的链接,当我滚动浏览大量 Surface Pro 广告时,我找到了 VS2015 的 2.6.2 并安装了它,然后手动将我项目的 .csproj 文件中的 TypeScriptTools 版本更改为 2.6。现在 VS 看到 2.6.2,lodash 错误和我现在得到的所有其他错误由于某种原因消失了。我仍然对关于 TypeScript 分配的实际问题以及下划线如何被识别方面的实际情况感兴趣。

以上是关于使用 SystemJS 的混合 AngularJS/Angular 应用程序中的 Lodash。我可以单独分配'_'吗?的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯与SystemJS

SystemJS Typescript 输入冲突

角度升级指南。 (SystemJS) 意外的令牌 <

使用 gulp-ng-annotate 和 gulp-systemjs-builder

构建混合 angular/angularjs 应用程序 - 如何在 angularjs 应用程序中加载 Angular 模块

Angular 混合错误:试图在设置之前获取 AngularJS 注入器