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

时间:2015-03-16 14:28:44

标签: angularjs gruntjs typescript bower restangular

我正在尝试为SPA项目设置restangular,但我无法将其解析为grunt-tsng的依赖项。我已经使用bower安装它(tsid用于来自definitelyTyped的打字稿定义)。

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-router ui-bootstrap 等正常运行。可能是什么原因造成的? grunt-tsng是否存在任何不兼容性?

1 个答案:

答案 0 :(得分:2)

好吧,我明白了。

执行grunt-tsng时,它会扫描所有依赖项/模块等,以自动将它们挂钩为角度,这样您就不必自己动手了。这里有两个简单的规则适用:注入的依赖关系是你自己的(例如,你可以在你的模块中有类型脚本的实例),只需要用它们的名字来定义。 E.g:

constructor(service: MyModule.IMyService) {}

外部依赖关系,例如从angular本身用'$'表示法声明。 grunt-tsng将假设它们的依赖项本身在运行时被解析,因此只需将它们与它们的名称联系起来:

constructor($routeProvider: ng.IRouteService) {}

但是现在restangular中的服务并没有被命名为'$ restangular',而只是'restangular'。这导致以下结果:

  • 当将其声明为'restangular'时,grunt-tsng将在您的模块中查找实现,找不到任何并且失败
  • 当声明为'$ restangular'时,angular会查找名为'$ restangular'的提供程序,找不到任何并且失败

<强>结论:

这是迟钝的。