使用node-fetch时如何使请求体类型与RequestInit或BodyInit兼容?

How to make request body type compatible with RequestInit or BodyInit when using node-fetch?

我开始在我的 nodejs 项目中使用 Typescript。为了访问一些外部 API,我使用 node-fetch 来发出请求。设置 PUT 请求时,弹出一个错误,提示给定的正文不可分配给类型 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 对象兼容?

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

另一个想法是 class 的实例可能不是合适的 body 类型。你能把它字符串化吗?

更新:我在 RequestInit 中也遇到了一个奇怪的错误,它通过指定选项的类型(你所谓的 'params')解决了 object,像这样:

let params: RequestInit = {
  ...
}

您需要将您的 body 字符串化:

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

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

这个:

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)
}