这是我的示例代码。 [ts]元素隐含有“任何”类型,因为“计算机”类型没有索引签名
interface iAdd {
add(a: number): number;
}
class Computer implements iAdd {
add(a: number): number {
return a + 1;
}
add10(a: number): number {
return a + 10;
}
}
var computer = new Computer();
console.log(computer.add(1));
console.log(computer.add10(1));
// for now everything is working, however what i want is below,
let methodName:string = 'add10';
computer[methodName]();
// now there is an error:
// I don't want to use this way to fix, i want a safer way.
(<any>computer)[methodName](); // don't want this fix
请帮帮我
答案 0 :(得分:1)
你无法获得更安全的方式&#34;您是否正在使用索引访问这些方法。
使用typescript 2.1编译时,您的代码不会产生任何错误,您可以try it in playground。
问题是这也没关系:
computer[methodName](3, 3);
即使它应该是一个错误。
你也可以这样做:
type FNs = "add" | "add10";
let methodName = "add10" as FNs;
computer[methodName](3);
但是所有签名都需要看起来一样,否则:
class Computer implements iAdd {
add(a: number): number {
return a + 1;
}
add10(a: number): number {
return a + 10;
}
addThese(a: number, b: number): number {
return a + 1;
}
}
type FNs = "add" | "add10" | "addThese";
let methodName = 'add10' as FNs;
computer[methodName](3);
结果:
无法调用类型缺少调用签名的表达式。类型 &#39;((a:数字)=&gt;数字)| ((a:数字,b:数字)=&gt;数字)&#39;没有 兼容的呼叫签名
但这应该可行:
type FNs = keyof Computer;
let methodName: FNs = 'add10';
computer[methodName](3);
methodName = 'add11'; // error: Type '"add11"' is not assignable to type '"add" | "add10" | "addThese"'
methodName = 'addThese';
computer[methodName](3, 4);
当您更改其中一个方法签名时,问题就开始了: