Типы сценариев тип 'строка | string [] 'нельзя назначить типу' string ', что такое' string | string [] 'type? как привести их в строку? - PullRequest
1 голос
/ 02 мая 2019

Когда я делаю 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 | string [] 'type? Я имею в виду, если я хочу использовать логические 'или' из двух строк в машинописи. Как это сделать?

и как наколоть 'строку | string [] 'type to string type?

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Попробуйте

let token = (req.headers['x-access-token'] || req.headers['authorization']) as string;

Компилятор считает, что req.headers ['some string'] - это массив строк, когда вы приводите одну сторону оператора or, вы получаете тип строки или массив строк. Так что сделайте или на обоих из них, а затем приведите результат в строку.

0 голосов
/ 03 мая 2019

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