2016-12-28 9 views
0

これは私のサンプルコードです。タイプ「コンピュータ」は何のインデックス署名要素の暗黙性には、 'Computer'型にインデックスシグネチャがないため、 'any'型があります。

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 

を持っていないので、 [TS]要素暗黙的には「あらゆる」タイプを持っているあなたがはるかに「安全な方法」を取得することができなくなります私に

答えて

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)| ((:数、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'を使って)で動作するはずです。問題が発生した場合は、例で質問を更新してください。 –