неизменный JS с Typescript: «Нет перегрузки соответствует этот вызов» при создании Map / OrderedMap - PullRequest
0 голосов
/ 22 апреля 2020

Я использую версию Typescript 3.8.3 с immutable@4.0.0-rc.12.

Когда я создаю OrderedMap с использованием двумерного массива для его создания, я получаю ошибку от Typescript.

let v: OrderedMap<number, string> = OrderedMap([ [ 3, '2' ] ])

Пример для Codesandbox.io

Похоже, файл определения библиотеки может быть неправильным? (immutable-nonambient.d.ts(1421, 39)). Это ошибка, которая мне дает:

No overload matches this call.
  Overload 1 of 4, '(collection: Iterable<[string | number, string | number]>): OrderedMap<string | number, string | number>', gave the following error.
    Argument of type '(string | number)[][]' is not assignable to parameter of type 'Iterable<[string | number, string | number]>'.
      The types returned by '[Symbol.iterator]().next(...)' are incompatible between these types.
        Type 'IteratorResult<(string | number)[], any>' is not assignable to type 'IteratorResult<[string | number, string | number], any>'.
          Type 'IteratorYieldResult<(string | number)[]>' is not assignable to type 'IteratorResult<[string | number, string | number], any>'.
            Type 'IteratorYieldResult<(string | number)[]>' is not assignable to type 'IteratorYieldResult<[string | number, string | number]>'.
              Type '(string | number)[]' is missing the following properties from type '[string | number, string | number]': 0, 1
  Overload 2 of 4, '(obj: { [key: string]: string; }): OrderedMap<string, string>', gave the following error.
    Type '(string | number)[]' is not assignable to type 'string'.ts(2769)
immutable-nonambient.d.ts(1421, 39): The expected type comes from this index signature.

Я получаю то же самое для Map. Если я создаю пустой Map или OrderedMap и назначаю его переменной, я могу безошибочно выполнять операции с данными, поэтому возникают проблемы с инициализацией таким способом.

Использование этой подписи: OrderedMap({ 3: '2' }) работает без ошибки компиляции. Но, очевидно, я не могу использовать его, так как хочу, чтобы мои ключи были числами, а использование массива - единственный способ достичь этого.

1 Ответ

1 голос
/ 22 апреля 2020

Прежде всего, @types/immutable больше не поддерживается

Этот пакет устарел

Сообщение автора:

Это является определением типов заглушки для неизменяемого в Facebook (https://github.com/facebook/immutable-js). Immutable Facebook предоставляет свои собственные определения типов, поэтому вам не нужно устанавливать @ types / immutable!

После удаления вы должны получить хорошие подсказки типов в вашем редакторе.

Работа пример: https://stackblitz.com/edit/typescript-vwetmv?file=index.ts

Обновление

Добавление "target": "es2015" в параметры компилятора устраняет ошибку.

См. документы: Использование TypeScript с неизменяемыми. js v4

Неизменяемые. js определения типов охватывают ES2015. В то время как Immutable. js сам поддерживает устаревшие браузеры и среды, для его определений типов требуется TypeScript 2015 lib. Включите "target": "es2015" или "lib": "es2015" в свой tsconfig.json или укажите --target es2015 или --lib es2015 для команды tsc.

...