Отсутствует подпись индекса в типе Array ‹string› с TypeScript

Я вижу эту ошибку с TypeScript:

введите здесь описание изображения

Сам код выглядит так:

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

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

         // ....

    }, cb);

};

Сообщение об ошибке:

TS2345: аргумент типа «строка []» не может быть назначен параметру типа «Словарь‹ {}> ». Индексная подпись отсутствует в типе 'string []'.

Как я могу это исправить? Как вы можете видеть на снимке экрана, типизация из библиотеки async не любит простой массив строк, переданный в качестве первого аргумента async.mapLimit, но почему?

Я на 99% уверен, что мне нужно добавить подпись индекса к массиву строк, но как мне это сделать?

Вот что-то, что «компилируется», но я не знаю, правильно ли это (похоже, это никому не помогает):

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

теперь, когда я использую (transformPaths: ISumanTransformPaths), он компилируется, но я не уверен, правильно ли это.


person Alexander Mills    schedule 27.06.2017    source источник
comment
Вам нужен другой тип. У вас есть массив, и вам нужно что-то вроде js-объекта (например: { key1: "value1", key2: "value2" })   -  person Nitzan Tomer    schedule 27.06.2017
comment
@NitzanTomer Я так не думаю - я думаю, что асинхронная библиотека примет Iterable, который может быть либо объектом, либо массивом. Но согласен, не очень понятно.   -  person Alexander Mills    schedule 27.06.2017
comment
Я не знаю эту async библиотеку, но обычно Dictionary означает ключ / значение. Можете ли вы поделиться ссылкой на файл определения для него?   -  person Nitzan Tomer    schedule 27.06.2017
comment
Да, я согласен с вами, я на 99% уверен, что Словарь означает ключ / значение. Я действительно теперь твердо верю, что тип def для async неверен. Это должно быть Iterable ‹T›, а не Dictionary ‹{}›.   -  person Alexander Mills    schedule 27.06.2017
comment
npmjs.com/package/@types/async   -  person Alexander Mills    schedule 27.06.2017
comment
Я все еще ищу ответ на эту чертову проблему: github.com/DefinentyTyped/DefinitiTyped/issues/24469   -  person Alexander Mills    schedule 23.03.2018


Ответы (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, который вы передаете, должен быть 4-м аргументом, а 3-й должен быть итератором.

person Nitzan Tomer    schedule 27.06.2017
comment
спасибо Nitzan, я разобрался, я добавил ответ, показывающий, что у меня работает. - person Alexander Mills; 27.06.2017
comment
Я все еще ищу ответ на эту проклятую проблему: github.com/DefinitiTyped/DefinentyTyped/issues/24469 - person Alexander Mills; 23.03.2018

Спасибо Ницану за подтверждение того, что @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);

   };
person Alexander Mills    schedule 27.06.2017