使用TypeScript在Array <string>类型中缺少索引签名

时间:2017-06-27 18:49:59

标签: typescript typescript2.0

我在TypeScript上看到了这个错误:

enter image description here

代码本身看起来像这样:

let fn =  function (transformPaths: Array<string>, cb: Function) {

    async.mapLimit(transformPaths, 5, function (t: string, $cb: Function) {

         // ....

    }, cb);

};

错误消息是:

  

TS2345:类型&#39;字符串[]&#39;的参数不能分配给参数   键入&#39;词典&lt; {}&gt;&#39;。类型&#39; string []&#39;。

中缺少索引签名

我该如何纠正?从截图中可以看出,async库的输入不像普通的字符串数组那样作为async.mapLimit的第一个参数传递,但为什么呢?

我99%确定我需要为字符串数组添加索引签名,但我该怎么做?

这是&#34;编译&#34;但我不知道它是否正确(这似乎并没有帮助任何人):

export interface ISumanTransformPaths extends Array<string> {
  [index:string]: Object
}

现在当我使用(transformPaths: ISumanTransformPaths)时,它会编译,但我不确定这是否正确。

2 个答案:

答案 0 :(得分:2)

signatures for this method是:

mapLimit<T, R, E>(arr: T[] | IterableIterator<T>, limit: number, iterator: AsyncResultIterator<T, R, E>, callback?: AsyncResultArrayCallback<R, E>): void;
mapLimit<T, R, E>(arr: Dictionary<T>, limit: number, iterator: AsyncResultIterator<T, R, E>, callback?: AsyncResultArrayCallback<R, E>): void;

因此它适用于Dictionary或数组/ IterableIterator 我不确定为什么编译器会推断第二个签名而不是第一个签名,但也许是因为你传递它的callback应该是第四个参数,而第三个参数需要是一个迭代器。

答案 1 :(得分:1)

感谢Nitzan确认@types/async可能是正确的。这解决了这个问题:

<强>之前:

 let fn = function (transformPaths: Array<string>, cb: Function) {

    async.mapLimit(transformPaths, 5, function (t: string, cb: Function){

     // problem...does not compile

    }, cb);
 } 

之后:(仔细看,只有一处变化)

  let fn = function (transformPaths: Array<string>, cb: AsyncResultArrayCallback<Error,Array<any>>) {

        async.mapLimit(transformPaths, 5, function (t: string, cb: Function) {

        // now it compiles!

        }, cb);

   };