打字稿键入'string |字符串[]'不可分配给类型'字符串','字符串|是什么?字符串[]'类型?如何将它们转换为字符串?

时间:2019-05-02 05:09:19

标签: string typescript logical-or

当我执行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 []'类型转换为字符串类型?

2 个答案:

答案 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']的类型可以为stringstring[](字符串数组)或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`
}