2017-01-25 3 views
0

Ich versuche, einen Dienst mit dynamisch erstellten Methoden zu schreiben.Dynamic Ionic2 Service-Methoden

test.service.ts:

import {Injectable} from '@angular/core'; 

@Injectable() 
export class TestService { 

    constructor() { 
    } 

    init(defaults: any) { 
    Object.keys(defaults).forEach(key => { 
     this[key] = (val?: any) => { 
     console.log(key, val) 
     } 
    }); 
    } 
} 

app.component.ts

export class MyApp { 

constructor(public platform: Platform, 
      private test:TestService) { 
    this.initializeApp(); 

    test.init({ 
    foo: 'bar' 
    }); 
    console.log(test); 
    test.foo('foobar'); 
} 

initializeApp() { 
    this.platform.ready().then(() => { 
    StatusBar.styleDefault(); 
    Splashscreen.hide(); 
    }); 
} 

}

Also, wenn ich die Zeile aus kommentieren test.foo('foobar'); es transpiling rechts. Wenn ich die Zeile zurück Kommentar- in es funktioniert (ich kann in der Konsole sehen), aber ich bekomme einen Typoskript Fehler:

[21:42:12] typescript: src/app/app.component.ts, line: 28 
      Property 'foo' does not exist on type 'TestService'. 

     L27:  console.log(test); 
     L28:  test.foo('foobar');

, die ich da zu der Zeit unterstand den Dienst des transpiling nicht das Verfahren hat. Meine Frage ist, wie ich Artescript sage, dass es mir egal ist.

ich test['foo']('foobar') verwenden könnte, aber ich will nicht ...

I created a git repo to demonstrate my attempt

Antwort

0
init<Defaults>(defaults: Defaults): this & Defaults { 
    return Object.assign({}, this, defaults); 
} 

sollte es tun, aber da wir einen neuen Wert, anstatt zu modifizieren sie zurückkehren, sollten wir umbenennen die Methode von init zu etwas wie withDefaults, ala das Erbauermuster, und benutzt es wie.

const withDefaults = test.withDefaults({ 
    foo: 'bar' 
}); 
console.log(withDefaults.foo); 
+0

Sorry, aber das ist nicht einmal annähernd das, was ich versuche zu tun. – Heiko