Полагаю, вы используете 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
будет использовать 2-ю часть типа 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`
}