无法解析模块功能的依赖关系 (restangular.IProvider)

Can't resolve dependency for module function (restangular.IProvider)

我正在尝试为 SPA 项目设置 restangular,但我无法将其作为 grunt-tsng 的依赖项来解决。我已经使用 bower(以及来自 definitelyTyped 的 typescript 定义的 tsd)安装了它。

grunt 任务配置

tsng: {
        options: {
            extension: ".ng.ts"
        },
        dev: {
            files: [
                // TODO: Automate the generation of this config based on convention
                {
                    src: ["Client/app/**/*.ts", "!**/*.ng.ts"],
                    dest: "Client/app"
                }
            ]
        }
    },

模块app.ts

/// <reference path="../../typings/tsd.d.ts" />

module App {

    var dependencies = [
        "ui.router",
        "ui.bootstrap",
        "restangular"
        ...
    ];

    function configuration(
        $stateProvider: ng.ui.IStateProvider,
        $urlRouterProvider: ng.ui.IUrlRouterProvider,
        RestangularProvider: restangular.IProvider, <-- here it fails
        ...

ts.d.ts(参考文件)

/// <reference path="restangular/restangular.d.ts" />

咕噜声错误

Running "tsng:dev" (tsng) task
Warning: Error: Can't resolve dependency for module function App.config with name restangular.IProvider Use --force to continue.

其他依赖,如ui-routerui-bootstrap等. 工作正常。这可能是什么原因造成的? grunt-tsng 是否存在已知的不兼容性?

好的,我明白了。

当执行 grunt-tsng 时,它会扫描所有 dependencies/modules 等并自动将它们挂接到 angular 中,因此您不必自己做。这里有两个简单的规则适用:您自己的要注入的依赖项(例如,在您有打字稿执行代码的地方,例如模块中的 类 )可以简单地用它们的名称来定义。例如:

constructor(service: MyModule.IMyService) {}

外部依赖,例如from angular 本身是用“$”符号声明的。 grunt-tsng 将假定它们的依赖项本身在运行时已解决,因此只需将它们与它们的名称挂钩:

constructor($routeProvider: ng.IRouteService) {}

但现在 restangular 中的服务不再命名为“$restangular”,而只是 'restangular'。这导致以下结果:

  • 将其声明为 'restangular' 时,grunt-tsng 将在您的模块中查找实现,未找到并失败
  • 将其声明为“$restangular”时,angular 将查找名为“$restangular”的提供程序,但未找到并失败

结论:

这是智障。