Как исправить ошибку компиляции Typescript ts2345 "Тип 'Response' отсутствует ... из типа 'Response': перенаправлен, трейлер, formData!" - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь сделать запрос, используя node-fetch в моем проекте машинописного текста, и я не понимаю, как исправить ошибку компиляции или что она на самом деле пытается мне сказать.

Я обновил все пакеты(включая глобальный пакет машинописи) до последних версий.

Я создал суть, которая изолирует ошибку: https://gist.github.com/HerrZatacke/ae90f608e042864b6e00e9c73a950602

Этот (очень короткий) сценарий способен воспроизводить компиляциюошибка:

import fetch from 'node-fetch';

const toJson = (response: Response):PromiseLike<object> => (
  response.json()
);

const makeSomeRequest = (): Promise<object> => {
  return fetch('https://some-api.com/')
    .then(toJson)
};

makeSomeRequest();

Установленные версии

@types/node-fetch 2.3.7
node-fetch2.6.0
typescript 3.5.2

фактическая ошибка

example.ts:9:11 - error TS2345: Argument of type '(response: Response) => PromiseLike<object>' is not assignable to parameter of type '(value: Response) => object | PromiseLike<object>'.
  Types of parameters 'response' and 'value' are incompatible.
    Type 'Response' is missing the following properties from type 'Response': redirected, trailer, formData

1 Ответ

0 голосов
/ 05 июля 2019

С помощью / подсказок двух вышеупомянутых комментариев (большое спасибо) мне удалось найти причину и решение этой ошибки:

Typescript изначально пытается «угадать», какие типы вы используете.

В следующей строке указано, что я хочу использовать тип response, который является интерфейсом родного Fetch API

const toJson = (response: Response): Promise<object> => {

определение типа для него можно найти в lib.dom.d.ts

node-fetch вместо этого реализует свой собственный тип Response из @ types \ node-fetch \ index.d.ts

Таким образом, если сначала импортируется правильный тип ответа , компилятор машинописи запускается без ошибки.

Это означает, что вместо простого импорта node-fetch вам также необходимо импортировать определение Response:

import fetch, { Response } from 'node-fetch';
...