首页 > 解决方案 > 是否可以使用变量来调用函数作为参数javascript

问题描述

假设需要使用执行相同操作但调用不同方法的条件。

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

正如副本所说,它不会那样工作。

标签: javascriptangulartypescript

解决方案


您可以使用索引访问来获取 Typescript 中的特定方法,诀窍是索引参数的类型。如果类型没有索引签名(类通常不应该),那么索引参数必须是类型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

推荐阅读