动态函数调用打字稿中的服务

时间:2017-04-17 17:34:17

标签: javascript angular typescript

我正在开发Angular2项目,我需要在其中生成动态函数,该函数将能够调用服务类下提供的服务。服务类有以下10个get函数。

例如:

我的服务类

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

@Injectable()
export class service {

  constructor() { }

  get function1(){
    return 1;
  }

  get function2(){
    return 2;
  }

  get function2(){
    return 3;
  }
}

我正在尝试创建一个函数,该函数将参数作为函数名称并返回相应的答案。

例如:

我的app.component.ts

import { Component} from '@angular/core';
import {service} from "./service";

@Component({
      selector: 'app',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css'],
      providers : [service]
 })

 export class AppComponent(){

  constructor(private _service:service){}

  let one = getVal(function1); /// This should return 1
  let two = getVal(function2); /// this should return 2

  getVal(val){
     return this._service.val; // but i am getting error val not exist on type service
    }

}

他们是否有任何解决方案,因为它可以帮助我减少代码和性能。

提前致谢

3 个答案:

答案 0 :(得分:1)

有点难以说出你在问什么,但这可能有所帮助。

class MyService {
 get function1() {
   return 1;
 }
  get function2() {
   return 2;
 }
  get function3() {
   return 3;
 }
}

const service = new MyService();

const getValFactory = service => name => service[name];
const getVal = getValFactory(service);

// Use strings, not unquoted function names.
console.log(getVal('function1'));
console.log(getVal('function2'));
console.log(getVal('function3'));

答案 1 :(得分:1)

function1等不只是'获取函数' - 它们是属性访问器方法。

相反,它可能应该是

let one = getVal('function1');

getVal(val){
 return this._service[val];
}

答案 2 :(得分:1)

您可以使用"任何"绕过TypeScript强类型检查。

return(this.service as any)[val]



class Service {
	constructor() {}
	get function1() {
		return 1;
	}
	get function2() {
		return 2;
	}
	get function3() {
		return 3;
	}
}

class AppComponent {
	constructor(private service: Service) {}
	getVal(val: string) {
		return (this.service as any)[val];
	}
}

const service = new Service();
const app = new AppComponent(service);
console.log(app.getVal("function1"));
console.log(app.getVal("function2"));
console.log(app.getVal("function3"));