如何修复 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:预期表达式