2017-06-27 4 views
1

Je vois cette erreur avec tapuscrit:signature index manquant dans le type tableau <string> avec tapuscrit

enter image description here

Le code lui-même ressemble à ceci:

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

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

     // .... 

    }, cb); 

}; 

Le message d'erreur est :

TS234 5: L'argument de type 'string []' n'est pas assignable au paramètre type 'Dictionary < {}>'. La signature d'index est manquante dans le type 'chaîne []'.

Comment puis-je corriger cela? Comme vous pouvez le voir sur la capture d'écran, les typings de la bibliothèque asynchrone n'aiment pas qu'un simple tableau de chaînes soit passé comme premier argument de async.mapLimit, mais pourquoi?

Je suis certain à 99% que je dois ajouter une signature d'index au tableau de chaînes, mais comment faire?

Voici quelque chose qui « compile », mais je ne sais pas si c'est correct (cela ne semble pas aider tout le monde):

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

maintenant, quand je l'utilise (transformPaths: ISumanTransformPaths), il compile, mais je ne suis pas sûr que ce soit correct.

+0

Vous avez besoin d'un autre type. Vous avez un tableau, et vous avez besoin de ce qui semble être un objet js (ie: '{key1:" value1 ", key2:" value2 "}') –

+0

@NitzanTomer Je ne pense pas - je pense que la bibliothèque async acceptera un Iterable, qui peut être un objet ou un tableau. Mais je suis d'accord, ce n'est pas très clair. –

+0

Je ne connais pas cette bibliothèque 'async', mais habituellement' Dictionary' signifie clé/valeur. Pouvez-vous partager un lien vers le fichier de définition pour cela? –

Répondre

2

Les signatures for this method sont:

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; 

Il peut travailler avec un Dictionary ou un tableau/IterableIterator.
Je ne sais pas pourquoi le compilateur déduit la 2ème signature au lieu de la première, mais peut-être parce que le callback que vous passez devrait être le 4ème argument, tandis que le 3ème doit être un itérateur.

+0

merci Nitzan, je l'ai compris, j'ai ajouté une réponse montrant ce qui fonctionne pour moi. –

0

Merci à Nitzan de confirmer que @ types/async est probablement correct. Cette résolu le problème:

avant:

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

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

    // problem...does not compile 

}, cb); 

après:

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

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

     // now it compiles! 

    }, cb); 

    };