2017-06-27 69 views
1

我看到这个错误与打字稿:缺失索引签名与打字稿

enter image description here

代码本身看起来就像这样:

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

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

     // .... 

    }, cb); 

}; 

该错误消息:

TS234 5:类型'字符串[]'的参数不可分配给参数 类型'字典< {}>'。类型'string []'中缺少索引签名。

我该如何解决这个问题?从屏幕截图中可以看到,异步库的类型不像将async.mapLimit的第一个参数传递给字符串的普通数组,但为什么?

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

下面是一些“编译”,但我不知道这是否是正确的(这似乎并没有被任何人帮助的):

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

现在,当我使用(transformPaths: ISumanTransformPaths),然后再编译,但我不确定这是否正确。

+0

你需要一个不同的类型。你有一个数组,你需要什么似乎是一个JS对象(即:{{key1:“value1”,key2:“value2”}) –

+0

@NitzanTomer我不这么认为 - 我认为异步库将接受一个Iterable,它可以是Object或Array。但我同意,这不是很清楚。 –

+0

我不知道这个'async'库,但通常'Dictionary'表示键/值。你能分享一个指向定义文件的链接吗? –

回答

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应该是第四个参数,而第三个需要是迭代器。

+0

感谢Nitzan,我想通了,我添加了一个答案,显示什么适合我。 –

0

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

    };