2017-01-25 7 views
0

私は動的に作成されたメソッドでサービスを作成しようとしています。だから、動的Ionic2サービスメソッド

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(); 
    }); 
} 

}

私はそれが正しいtranspilingだtest.foo('foobar');行をコメントアウトします。私はそれに戻って行のコメントを解除すると動作します(私はコンソールで見ることができる)が、私は活字体のエラーを取得:

サービスをtranspiling時にメソッドを持っていないので、私はunterstand
[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');

。 私の質問は、Typescriptに気にしないことを伝える方法です。

私はtest['foo']('foobar')を使用することができますが、私はしたくない...

I created a git repo to demonstrate my attempt

答えて

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

はトリックを行う必要がありますが、我々はそれを修正するのではなく、新しい値を返すされているので、私たちは名前を変更する必要がありますメソッドinitからwithDefaultsのようなものに、alaビルダーパターンを使用してください。

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

申し訳ありませんが、これは私がやろうとしているものにも近いです。 – Heiko

関連する問題