我有一个对象remote
,它本身不是一个类实例。由于Angular 2-5的性质,我需要在服务中包装此Object,以便将其注入组件中。该对象具有声明为“Remote
”的接口。
我将如何进行以下工作?
import { Injectable } from '@angular/core';
import { remote, Remote } from 'electron';
@Injectable()
export class RemoteService implements Remote {
constructor() {
Object.assign(this, remote);
}
}
即,如何创建一个服务类RemoteService
哪些实例看起来像Remote
,而不必手动包装所有remote
的成员?我不能使用extend,因为remote
本身不是一个类的实例,只是一个对象。
在上面的示例中,Typescript编译器会抱怨RemoteService
错误地实现了Remote
(当然)。有没有办法强迫编译器将RemoteService
理解为实现Remote
?
答案 0 :(得分:7)
TypeScript类应该使用接口进行扩充。这导致合并声明断言已实现Remote
方法:
import { remote, Remote } from 'electron';
export interface RemoteService extends Remote {}
@Injectable()
export class RemoteService implements Remote {
constructor() {
Object.assign(this, remote);
}
}
Object.assign
只有在属性不变且方法属于自己且可枚举的情况下才能正常工作。
为了更有效的继承,可以创建基类以提供原型链:
import { remote, Remote } from 'electron';
export interface BaseRemote extends Remote {}
export class BaseRemote implements Remote {}
BaseRemote.prototype = remote;
@Injectable()
export class RemoteService extends BaseRemote {
/* custom methods */
}
如果一个类扩展了对this
上下文有限制的异域对象(请参阅the example with native sessionStorage
object),或绑定了对象方法,则应以任何方式为原始方法提供包装器方法。如果以编程方式创建包装器方法(通过使用for..in
等迭代属性而不是通过class
语法,则应合并声明应另外用于正确键入。