2016-12-28 75 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')。如果您遇到問題,請使用示例更新問題。 –

相關問題