我是新的打字,我道歉,如果我的行话的语言是关闭。
我想创建一个泛型函数,它可以有一个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
的授权,但是这并没有解决打字错误。有什么解决办法吗?
1条答案
按热度按时间bvjveswy1#
将
AxiosRequestHeaders
类型添加到headers变量解决了类型错误。在没有将类型添加到头部的情况下,这就是推断的内容:
添加类型:
const headers: AxiosRequestHeaders = authorization
可以这样推断:正如在一些评论中提到的,在我的tsconfig中可能有更多的事情导致了这一点,我最初的解决方案在基本配置中工作。