是否可以使用Typescript中的Generics访问类的属性?

时间:2017-03-09 00:10:04

标签: angularjs generics typescript

我有以下类,它将成为应用程序实体的基础

namespace Base {
    export abstract class BaseEntity {
        endpoint: string;
        public abstract getId(): string;
    }
}

这个类的实现如下:

namespace Example {
    export class Account extends Base.BaseEntity {
        accountId?: string;
        name?: string;
        constructor() {
            super();
            this.endpoint = "accounts";
        }

        public getId(): string {
            return this.accountId;
        }
    }
}

这样做的目的是能够获得每个类的endpoint属性的值,以便知道在Api Web中定义的Web方法的URL。

以下是示例:

namespace Base {
    export class BaseService<T extends BaseEntity> {
        private url: string;
        constructor(
            private $q: angular.IQService,
            private $http: angular.IHttpService) {
            this.url = `http://localhost:81/api/${(<BaseEntity>T).endpoint}`; //ERROR: 'T' only refers to a type, but is being used as a value here.
        }
    }
}

但是在此指令${(<BaseEntity>T).endpoint}上抛出以下错误:

  

//错误:'T'仅指类型,但在此处用作值。

如何动态访问该属性的值?

更新  我需要从角度控制器开始:

namespace Example {

    class AccountController extends Base.BaseController<Account> {

    }
    angular
        .module("Example")
        .controller("AccountController", AccountController);
}

在控制器构造函数中,从控制器定义

传递定义了T的BaseService
namespace Base {
    export class BaseController<T extends Base.BaseEntity> {
        list: Array<T>;
        constructor(
            private baseService: Base.BaseService<T>
        ) {            

        }

        public get(): void {
            this.baseService.get().then(
                list => {
                    this.list = list;
                },
                error => {
                    console.error("Error: ",error);
                }
            )
        }

        public save(entity: T): void {
            this.baseService.save(entity).then(
                resp => {
                    if (resp.completed) {
                        //TODO: code.
                    }
                },
                error => {
                    console.error("Error: ", error);
                }
            )
        }
    }
}

现在我明白'T'是一种类型而不是价值, 但如何实现此代码的重用? 因为我看到我在所有控制器和服务中重复相同的代码,它只会更改实体

0 个答案:

没有答案