是否可以使用变量将函数作为参数javascript

时间:2019-05-24 08:43:18

标签: javascript angular typescript

假定需要使用条件控件,它们执行相同的操作但调用不同的方法。

const c = true; // for example sake 
let b = '';
if (c) {
  b = 'method1';
} else {
  b = 'method2';
}

function a(){
   this.service.b(filter).subscribe((result) =>{
      // stuff happens
   });
}

是否可以使用变量b作为动态变量来从服务中调用方法?

Stackblitz example

根据示例更新的代码段,我可以执行以下操作:

if (this.title == 'Students') {
  this.studentService.getStudents().then(results=> this.lists = results);
} else {
  this.studentService.getCandidates().then(results => this.lists = results);
}

但是有可能做类似的事情:

this.studentService.get[this.title]().then(results=> this.lists = results);

,因为复制品说不会那样做。

2 个答案:

答案 0 :(得分:1)

您可以使用索引访问来获取Typescript中的特定方法,诀窍是索引参数的类型。如果该类型没有索引签名(并且通常没有类),则index参数必须为keyof

类型。
class DoStuff {
    messageA() : Promise<string> {
        return new Promise(r=> r("messsageA"));
    }

    messageB() : Promise<string> {
        return new Promise(r=> r("messsageB"));
    }
}

let k: keyof DoStuff = Math.random()> 0.5 ? "messageA" : "messageB";
let o = new DoStuff();
o[k]().then(m=> console.log(m))

如果该类包含更多具有不兼容签名的方法,则您可能无法调用o[k]的结果。您可以通过列出要索引的确切方法来解决此问题(`let k:“ messageA” |“ messageB”)。或者您可以使用taht类型过滤键:

class DoStuff {
    messageA() : Promise<string> {
        return new Promise(r=> r("messsageA"));
    }

    messageB() : Promise<string> {
        return new Promise(r=> r("messsageB"));
    }
    util(): string { return ""}
}

let k: keyof DoStuff = (Math.random()> 0.5 ?"messageA" : "messageB") as keyof DoStuff;
let o = new DoStuff();
o[k]().then(m=> console.log(m)) //error

type FilterKeysByType<T, V> = { [P in keyof T] : T[P] extends V ? P : never}[keyof T]
let kok:FilterKeysByType<DoStuff, ()=> Promise<string>>  =  (Math.random()> 0.5 ?"messageA" : "messageB") as FilterKeysByType<DoStuff, ()=> Promise<string>>;
o[kok]().then(m=> console.log(m)) //error

答案 1 :(得分:-1)

是,但是您可以将函数分配给变量,例如,

function bla() {
  console.log('bla');
}
let b = bla;
b();

由于我看到一些反对意见,因此我应该对此进行详细说明。如果要在b上呼叫this.service,则无法如上所述进行操作。

对象上的功能存储在具有功能名称的键下。您应该在此处使用字符串。例如

let thing = {};
thing.a = function() {}
let b = 'a';
thing[b]();

如果您的对象是类,则同样适用,例如

class Thing {
 bla() {}
}
let a = new Thing();
let b = "bla";
a[b]();
相关问题