动态Ionic2服务方法

时间:2017-01-25 21:01:30

标签: angular typescript ionic-framework 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();
  });
}

}

因此,当我注释掉test.foo('foobar');行时,它正好向右转。当我取消对该行的注释时,它可以工作(我可以在控制台中看到),但是我收到了一个Typescript错误:

[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

1 个答案:

答案 0 :(得分:0)

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

应该这样做但是因为我们返回一个新值而不是修改它,我们应该将方法从init重命名为withDefaults,类似于构建器模式,并使用它。

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