通过Object.assign

时间:2018-01-29 06:39:37

标签: javascript angular typescript

我有一个对象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

1 个答案:

答案 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语法,则应合并声明应另外用于正确键入。