17

我开始在我的 nodejs 项目中使用 Typescript。为了访问一些外部 API,我使用 node-fetch 来发出请求。在设置 PUT 请求时,会弹出一个错误,指出给定的正文不可分配给 type RequestInit

错误:

Error:(176, 28) TS2345:Argument of type '{ headers: Headers; method: string; body: MyClass; }' is not assignable to parameter of type 'RequestInit'.
  Types of property 'body' are incompatible.
    Type 'MyClass' is not assignable to type 'BodyInit'.
      Type 'MyClass' is not assignable to type 'ReadableStream'.
        Property 'readable' is missing in type 'MyClass'.

我的课:

class MyClass {
  configId: string;
  adapterType: string;
  address: string;

  constructor(configId: string, adapterType: string, address: string) {
    this.configId = configId;
    this.adapterType = adapterType;
    this.address = address;
  }

  // some methods
}

调用:

let body = new MyClass("a", "b", "c")
let url = config.url + "/dialog/" + dialogId
let headers = new Headers()
// Append several headers

let params = {
  headers: headers,
  method: "PUT",
  body: body
}

return new Promise((resolve, reject) => {
  Fetch(url, params) // <-- error is shown for params variable
    .then(res => {
      // Do stuff
      resolve(/*somevalue*/)
    })
}

我应该如何使 body 对象兼容?

4

3 回答 3

25

你需要把你的身体串起来:

let params: RequestInit = {
  headers: headers,
  method: "PUT",
  body: JSON.stringify(body)
}
于 2019-11-12T10:43:27.963 回答
11

我可以想到两种可能的方法 - 一种是以特定方式设置标题以补充您的body类型将解决它。

另一种想法是类的实例可能不是合适的主体类型。你能把它串起来吗?

更新: RequestInit 也有一个奇怪的错误,它通过指定选项的类型(你称之为'params')对象来解决,如下所示:

let params: RequestInit = {
  ...
}
于 2017-07-11T18:17:13.770 回答
0

我不得不从而不是使用内置的打字稿导入RequestInitnode-fetch

IE

这个:

import fetch, { RequestInit } from 'node-fetch'

let params: RequestInit = {
  headers: headers,
  method: "PUT",
  body: JSON.stringify(body)
}

不是这个:

import fetch from 'node-fetch'

let params: RequestInit = {
  headers: headers,
  method: "PUT",
  body: JSON.stringify(body)
}
于 2021-06-07T10:57:17.337 回答