我在TypeScript上看到了这个错误:
代码本身看起来像这样:
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)
时,它会编译,但我不确定这是否正确。
答案 0 :(得分:2)
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);
};