typescript 无法使用 react-native 将 headers 添加到提取 api

typescript Cannot add headers to a fetch api using react-native

我正在使用 Fetch API from react-native 并且我正在使用 typescript。 我的代码如下所示:

let responseLogin = await fetch('http://url_example', {
        method: 'POST',
        headers: {'Content-Type':'application/json'},
        body: requestBody
    });

但我在 header 处出现以下错误:

 Argument of type '{ method: string; headers: { 'Content-Type': string; }; body: string; }' is not assignable to parameter of type 'RequestInit'.
  Types of property 'headers' are incompatible.
    Type '{ 'Content-Type': string; }' is not assignable to type 'Headers | string[][]'.
      Object literal may only specify known properties, and ''Content-Type'' does not exist in type 'Headers | string[][]'.

我也试过创建自定义 header 但没有成功:

    let requestHeaders = new Headers();
        requestHeaders.set('Content-Type', 'application/json');
        // I have also tried adding this at the end but no luck 
        // requestHeaders.get('Content-Type');

如何向其中添加 header?因为我找不到任何方法来实现这一点,而且我不知道问题出在哪里。如果我在邮递员中测试这些,我会得到 200 响应,在这里我会得到 401 响应。 我也试过这个库只是为了添加自定义 headers: https://www.npmjs.com/package/fetch-headers

我使用: Visual studio 代码 1.81.1 "react-native": "0.50.0", "typescript": "2.6.1"

您的构建中包含哪些 TypeScript 库?看起来您对 headers 属性 的定义是错误的。在 TypeScript 2.6.2 中,headers 属性 是 HeadersInit 类型,定义为: type HeadersInit = Headers | string[][] | { [key: string]: string };

我已经解决了这样的问题:

let requestHeaders: any = { 'Content-Type': 'application/json' };
let responseLogin = await fetch('URL', {
  method: 'POST',
  headers: requestHeaders,
  body: requestBody
});

我所要做的就是忽略该错误消息,因为 JS 正确地解释了语法,只有 typescript 没有,我通过创建一个变量来存储这两个字符串来做到这一点。

你能试着输入 HeadersInit 吗?

const requestHeaders: HeadersInit = new Headers();
requestHeaders.set('Content-Type', 'application/json');

const responseLogin = await fetch('URL', {
  method: 'POST',
  headers: requestHeaders,
  body: requestBody
});

如果不是,您能否显示您在使用 Headers() 构造函数启动它时遇到的错误,您在问题中已显示?

我解决了导入的问题,像这样

从 'node-fetch' 导入提取,{Headers};

接受的答案有一个警告,即它不处理将 fetch 封装到您自己的函数中的情况,该函数接收与 fetch 相同的参数并将默认值设置为 headers 属性。例如:

async function myFetch(input: RequestInfo, init: RequestInit) {
  // set some headers here
  const res = await fetch(input, init)
  // return something from the response here, handle errors
}

已解决答案的问题是 RequestInit.headers 属于 HeadersInit 类型,其定义为:

type HeadersInit = string[][] | Record<string, string> | Headers;

当我尝试为 headers 设置默认值但仍然使用调用函数传递的 headers 时,我 运行 遇到了问题,因为我需要处理这些可能的多种类型与.

我完全恼怒的解决办法是定义我自己的 RequestInit 类型,其中 headers 只是 Record<string, string>。我不关心其他类型,字符串 key/values 的 object 没问题。



export interface MyRequestInit extends Omit<RequestInit, 'headers'> {
  headers?: Record<string, string>;
}

export async function fetchJson<JSON = unknown>(
  input: RequestInfo,
  init: MyRequestInit = {},
) {
  // set my own default headers here
  const res = await fetch(input, init)
  // ...
}