2017-06-27 29 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); 

    };