当我执行TypeScript时:
let token = req.headers['x-access-token'] || req.headers['authorization'] as string;
我遇到其他错误:
Argument of type 'string | string[]' is not assignable to parameter of type 'string'
任何人都知道什么是“字符串|字符串[]'类型?我的意思是,如果我想在打字稿中使用两个字符串的逻辑“或”。怎么做?
以及如何强制转换字符串string []'类型转换为字符串类型?
答案 0 :(得分:1)
尝试
let token = (req.headers['x-access-token'] || req.headers['authorization']) as string;
编译器认为req.headers ['some string']是一个字符串数组,当您转换or运算符的一侧时,会得到一种类型的字符串或字符串数组。因此,对它们两个进行或,然后将结果强制为字符串。
答案 1 :(得分:0)
我猜您正在使用node.js。在这种情况下,req.headers
的类型为IncomingHttpHeaders
,其索引签名为:[header: string]: string | string[] | undefined;
这意味着req.headers['whatever']
的类型可以为string
或string[]
(字符串数组)或undefined
req.headers['x-access-token']
的第一部分的类型为string | string[] | undefined
req.headers['authorization'] as string
的类型为string
token
的类型为string | string[]
,因为
string | string[]
or
将使用类型为string
的第二部分 提示
可以使用req.headers['authorization']
类型的req.headers.authorization
来代替string | undefined
。
interface IncomingHttpHeaders {
..
'authorization'?: string;
..
[header: string]: string | string[] | undefined;
}
详细信息
注意:Adrian Brand的答案很好,您可以按原样使用它。为了完整起见,我将仅展示一种详细的方式来处理所有情况并说明类型:
const tokenValue= req.headers['x-access-token'] || req.headers['authorization'];
tokenValue
的类型为string | string[] | undefined
。
请注意,当所有标头都不存在时,它也可以是undefined
。
我们可以处理这种情况:
if (!tokenValue) throw Error('missing header')
此检查打字稿足够聪明之后,知道tokenValue
现在的类型为string | string[]
if (Array.isArray(a)) {
throw Error('token must be a string');
// note: you could also extract the first array item and use that as your token.
} else {
// In this if branch, the type of`tokenValue` is `string`
}