2016-12-28 67 views
0

这是我的示例代码。 [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

你将无法得到的多“更安全的方式”您将使用索引访问这些方法。

使用typescript 2.1编译时,您的代码不会产生任何错误,您可以try it in playground

的问题是,这也将是罚款:即使

computer[methodName](3, 3); 

它应该是一个错误。

你也可以这样做:

type FNs = "add" | "add10"; 
let methodName = "add10" as FNs; 
computer[methodName](3); 

code in playground

但随后的所有签名需要寻找相同的,否则:

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

结果:

不能调用快递其类型缺少呼叫签名的离子。键入 '((a:number)=> number)| ((A:编号,B:数)=>号)”没有 兼容调用签名

但这应该很好地工作:

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

code in playground

问题开始当您更改方法签名之一时:

+0

感谢Nitzan为您解答。我真正的问题是,我不知道它会有多少功能,计算机类也可以继承。它会引入更多的功能,我希望methodName可以是动态的,真正的功能将在实时确定。我怎样才能做到这一点? –

+0

应该使用我给出的最后一个选项(使用'keyof')。如果您遇到问题,请使用示例更新问题。 –

相关问题