假定需要使用条件控件,它们执行相同的操作但调用不同的方法。
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
作为动态变量来从服务中调用方法?
根据示例更新的代码段,我可以执行以下操作:
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);
,因为复制品说不会那样做。
答案 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]();