我有以下类,它将成为应用程序实体的基础
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的BaseServicenamespace 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'是一种类型而不是价值, 但如何实现此代码的重用? 因为我看到我在所有控制器和服务中重复相同的代码,它只会更改实体