元素隐含具有“任意”类型,因为“计算机”类型没有索引签名

时间:2016-12-28 07:58:07

标签: typescript

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

请帮帮我

1 个答案:

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

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

结果:

  

无法调用类型缺少调用签名的表达式。类型   &#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);

code in playground

当您更改其中一个方法签名时,问题就开始了: