如何修复 Typescript 编译错误 ts2345“类型 'Response' 丢失......来自'Response'类型:重定向、预告片、formData!”

Posted

技术标签:

【中文标题】如何修复 Typescript 编译错误 ts2345“类型 \'Response\' 丢失......来自\'Response\'类型:重定向、预告片、formData!”【英文标题】:How to fix Typescript compilation error ts2345 "Type 'Response' is missing ... from type 'Response': redirected, trailer, formData!"如何修复 Typescript 编译错误 ts2345“类型 'Response' 丢失......来自'Response'类型:重定向、预告片、formData!” 【发布时间】:2019-11-14 13:41:58 【问题描述】:

我试图在我的打字稿项目中使用node-fetch 发出请求,但我不明白如何修复编译错误或它实际上试图告诉我什么。

我已将所有包(包括全局 typescript 包)更新到最新版本。

我创建了一个隔离错误的要点: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

【问题讨论】:

在我看来,两种不同的类型同名Response 好的,听起来很合理。由于我对打字稿很陌生,这不应该发生吗? Typings for node-fetch Response 没有您在源代码中看到的这三个属性:github.com/DefinitelyTyped/DefinitelyTyped/blob/… 为什么不使用本机 Promise 类型而不是 @ 987654330@? 不幸的是,使用Promise 而不是PromiseLike 会导致同样的错误 【参考方案1】:

在上面两位评论者的帮助/提示下(非常感谢),我设法找到了该错误的原因和解决方案:

Typescript 最初会尝试“猜测”您正在使用的类型。

下面一行声明我想使用类型response,它是原生Fetch API的一个接口

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

它的类型定义可以在lib.dom.d.ts中找到

node-fetch 是从 @types\node-fetch\index.d.ts 实现它自己的 Response 类型

因此,如果首先导入 正确 响应类型,则 typescript 编译器运行时不会出现错误。

这意味着,除了导入node-fetch之外,您还必须导入Response的定义:

import fetch,  Response  from 'node-fetch';

【讨论】:

以上是关于如何修复 Typescript 编译错误 ts2345“类型 'Response' 丢失......来自'Response'类型:重定向、预告片、formData!”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 VSCode 中的“预期表达式。ts(1109)”?

修复 typescript 中的 strictBindCallApply 相关错误

Typescript 编译错误:错误 TS1109:预期表达式

如何为 TypeScript 定义文件导入文件

Svelte + Typescript = 如何使错误消失?

Vue 和 TypeScript:找不到名称“出口”