【问题标题】:How to write an interface for controller factory return type如何为控制器工厂返回类型编写接口
【发布时间】:2016-09-08 09:13:33
【问题描述】:

我正在尝试尽可能多地从我的应用程序中删除对“任何”的引用。是否有可能摆脱这个 - 我可以为我的控制器工厂编写什么接口?

return (controller) as any;
module TsApp.Home {
    "use strict";

    export interface IBlogEntries {
        blogEntries: Common.BlogEntry[];
    }

    interface IBaHomeController {
        $scope: IBlogEntries;
        baBlogEntriesService: Common.IBlogEntries;
        $http: ng.IHttpService;
    }

    class BaHomeController {
        $scope: IBlogEntries;
        baBlogEntriesService: Common.IBlogEntries;
        $http: ng.IHttpService;

        public static factory(): IBaHomeController[] {
            const controller = (log: ng.ILogService, $scope: IBlogEntries, blogEntriesService: Common.IBlogEntries, http: ng.IHttpService
            ): IBaHomeController => {
                return new BaHomeController(log, $scope, blogEntriesService, http);
            };

            controller.$inject = ["$log", "$scope", "BaBlogEntriesService", "$http"];

            return (controller) as any; //#2
        }

        constructor(private $log: ng.ILogService, $scope: IBlogEntries, private bBaBlogEntriesService: Common.IBlogEntries,
            private http: ng.IHttpService) {
            const defer = bBaBlogEntriesService.getAsync();
            defer.then(response => {
                $scope.blogEntries = response.data;
                $log.debug("blog entries");
            });
        }
    }

    angular
        .module("Main")
        .controller("BaHomeController", BaHomeController.factory()); //#1
}

我认为“返回(控制器)为 IBaHomeController[];”会工作,但我得到这个错误:

类型 '(log: ILogService, $scope: IBlogEntries, blogEntriesService: IBlogEntries, http: IHttpService) =>...' 和类型 'IBaHomeController[]' 都不能分配给另一个。 类型 '(log: ILogService, $scope: IBlogEntries, blogEntriesService: IBlogEntries, http: IHttpService) =>...' 中缺少属性 'push'。

由于这是方法定义的返回类型,我认为它会起作用。这让我相信我需要更改方法的返回类型?

编辑:如果有更简单的方法来注入依赖项,那也适用于我。

【问题讨论】:

    标签: angularjs typescript typescript1.8


    【解决方案1】:

    它在抱怨,因为工厂方法的返回类型是 IBaHomeController 的数组,而您正试图返回 BaHomeController 的单个实例并试图将其转换为数组。

    如果您返回单个实例,它将起作用。

      public static factory(): IBaHomeController {
            const controller = (log: ng.ILogService, $scope: IBlogEntries, blogEntriesService: Common.IBlogEntries, http: ng.IHttpService
            ): IBaHomeController => {
                return new BaHomeController(log, $scope, blogEntriesService, http);
            };
    
            controller.$inject = ["$log", "$scope", "BaBlogEntriesService", "$http"];
    
            return (controller) as IBaHomeController;
        }
    

    不确定是否能解决您的目的。

    【讨论】:

    • 我尝试了您的更改,但出现两个错误。 1) 角度控制器方法会产生此错误:TS2345 类型为“IBaHomeController”的参数不可分配给类型为“any[]”的参数。 “IBaHomeController”类型中缺少属性“长度”。 BaHomeController.ts 43. 此外,转换为 IBaHomeController 会导致错误:TS2345 “IBaHomeController”类型的参数不可分配给“any[]”类型的参数。 “IBaHomeController”类型中缺少属性“长度”。 BaHomeController.ts 43
    • 您是否在工厂或尝试使用的地方出错?
    • 我添加了一条注释 //#1 以指示第一个错误发生的位置, //#2 表示第二个错误
    • 您能否将工厂的返回类型设置为 IBaHomeController 而不是 #2 的 IBaHomeController[] 将任何作为 IBaHomeController,在 #1 使用 [ BaHomeController.factory() ] 看到工厂用方括号括起来表示数组。
    • 当然它应该抱怨,我应该早点看到它,控制器是一个函数,当你试图将它转换为 IBaHomeController 类型不匹配。您必须获取所有可注射的实例,并且在返回时必须提供控制器(...所有可注射)作为 IBaHomeController。
    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多