通用类型名称注入

时间:2014-08-08 21:05:04

标签: angularjs typescript

我正在用打字稿写我的角度应用程序。 为了防止冗余,我想完成某种类型的通用处理。 这就是我来自的地方:

    class BaseProvider {
    api_url = 'http://localhost:80/api/FILL_OUT_PATH/:id';
    $get($resource){
        var provider = $resource(this.api_url, {}, {
            update: {
                method: 'PUT'
            }
        });
       return provider;
    }
    }

    class User extends BaseProvider{
        constructor() {
            super();
            this.api_url = 'http://localhost:80/api/users/:id';
        }
    }

然后

    module Controllers
    {
        export class BaseController {
            message = "Base controller";
            entity : any;
            entities : any;
            constructor($scope)
            {

            }
        }
    }

    module Controllers
    {
        export class UserController extends BaseController {
            name = "UserController";
            constructor($scope, User)
            {
                super($scope);

                this.entity = new User();
                this.entities = User.query();
                $scope.vm = this;
            }

        }
    }

这是我想要使用UserController(P-Code)的地方:

module Controllers
        {
            export class UserController<T extends BaseProvider> extends BaseController {
                name = "UserController";
                static $inject = ['$scope', T.typename];        // Inject the types name somehow?
                constructor($scope, entity)     
                {
                    super($scope);

                    this.entity = new T();
                    this.entities = T.query();
                    $scope.user = this;
                }

            }

打字稿中是否有设施处理此问题?

2 个答案:

答案 0 :(得分:0)

  

打字稿中是否有设施来处理这个问题?

没有。所有类型信息都从生成的JS中删除,因此您不能将通用参数用作变量。

答案 1 :(得分:0)

由于在运行时没有打字相关信息,因此没有办法使用泛型,但作为一种解决方法,您可以通过构造函数传递类型并使用泛型键入安全性。以下代码编译时没有错误,并显示了如何完成它。

class C1 {
    m() { }
}

class C2 extends C1 { }

class C<T extends C1> {
    constructor(t: { new (): C1 }) {
        var instance = new t();
    }
}

new C(C2);