axios 可选参数是类型检查和错误与类型保护

v6ylcynt  于 2023-10-18  发布在  iOS
关注(0)|答案(1)|浏览(121)

我是新的打字,我道歉,如果我的行话的语言是关闭。
我想创建一个泛型函数,它可以有一个OAUTH令牌传递给它。
以下是我的尝试:

import { AxiosStatic } from 'axios'

export function createAxiosInstance(
  axiosFactory: AxiosStatic,
  baseUrl: string,
  apiKey: string,
  clientId: string,
  clientSecret: string,
  authorization?: string | undefined
) {
  const headers = authorization
    ? {
      Accept: 'application/json',
      'Content-Type': 'application/json',
      'X-Api-Key': apiKey,
      Authorization: authorization
    }
    : {
      Accept: 'application/json',
      'Content-Type': 'application/json',
      'X-Api-Key': apiKey
    }
  return axiosFactory.create({
    baseURL: baseUrl,
    headers
  })
}

headers对象要么具有Authorization属性,要么不基于参数。
但是,axiosFactory.create中return语句中的headers对象抛出了一个类型脚本错误:
键入“{接受:string; 'Content-Type':string; 'X-Api-Key':string;授权:string; }|{ Accept:string;'内容类型':string; 'X-Api-Key':string;授权?:未定义;}“不能分配给类型”AxiosRequestHeaders|未定义'。键入“{接受:string; 'Content-Type':string; 'X-Api-Key':string;授权?:未定义;“}”不能分配给类型“AxiosRequestHeaders”。属性“Authorization”与索引签名不兼容。类型“undefined”不能分配给类型“string| number|布尔值
下面是tsconfig.json文件:

{
  "compileOnSave": false,
  "compilerOptions": {
    "rootDir": ".",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "importHelpers": true,
    "target": "es2015",
    "module": "esnext",
    "lib": ["es2017", "dom"],
    "skipLibCheck": true,
    "skipDefaultLibCheck": true,
    "baseUrl": ".",
    "strictNullChecks": true
  },
  "exclude": ["node_modules", "tmp"],
  "ts-node": {
    "compilerOptions": {
      "module": "commonjs"
    }
  }
}

我正在使用的axios库定义了AxiosRequestHeaders,而且似乎Authorization只能是string | number | boolean。在我的场景中,Authorization可以是undefined。我以为类型检查(检查authorization的值)可以解决这个问题,因为我从来没有使用undefined的授权,但是这并没有解决打字错误。有什么解决办法吗?

bvjveswy

bvjveswy1#

AxiosRequestHeaders类型添加到headers变量解决了类型错误。

import { AxiosRequestHeaders, AxiosStatic } from 'axios'

export function createAxiosInstance(
  axiosFactory: AxiosStatic,
  baseUrl: string,
  apiKey: string,
  clientId: string,
  clientSecret: string,
  authorization?: string | undefined
) {
  const headers: AxiosRequestHeaders = authorization
    ? {
      Accept: 'application/json',
      'Content-Type': 'application/json',
      'X-Api-Key': apiKey,
      Authorization: authorization
    }
    : {
      Accept: 'application/json',
      'Content-Type': 'application/json',
      'X-Api-Key': apiKey
    }
  return axiosFactory.create({
    baseURL: baseUrl,
    headers
  })
}

在没有将类型添加到头部的情况下,这就是推断的内容:

添加类型:const headers: AxiosRequestHeaders = authorization可以这样推断:

正如在一些评论中提到的,在我的tsconfig中可能有更多的事情导致了这一点,我最初的解决方案在基本配置中工作。

相关问题