Почему TypeScript выдает ошибку при поиске строки в массиве с .include? - PullRequest
0 голосов
/ 26 марта 2020

В следующем примере кода TypeScript выдает ошибку Argument of type 'string' is not assignable to parameter of type 'Item'. ts(2345).

type Item = 'foo' | 'bar' | 'baz'

const isInArray = (str: string) => {
  const arr: Item[] = ['foo', 'bar', 'baz']

  return arr.includes(str)
                      ^^^
}

Я понимаю, что мог бы удалить тип Item[] из arr, который превратил бы его в string[] и предотвратить ошибку, однако, в реальной жизни, где я столкнулся с этим, массив является результатом сопоставления некоторого массива объектов, который набирается, в результате чего массив соответствующим образом набирается.

Я чувствую как это должно работать, так как мы заранее знаем, каковы значения массива, но не обязательно, что является входным аргументом.

Я предполагаю, что что-то упустил. Почему происходит эта ошибка и как я могу ее устранить?

Ответы [ 2 ]

1 голос
/ 26 марта 2020

string является более широким типом, чем Item, и когда массив набирается с помощью Item, вы также должны передать Item.

. У вас есть несколько вариантов:

  1. Измените аргумент на Item, как предложил inthedark122. Таким образом, ваша система типов гарантирует, что вы не сможете даже вызвать isInArray без нормального типа.
  2. Использовать arr.includes(str as any). Вы в основном говорите: «Я знаю, что я делаю».
  3. В своей функции сначала проверьте, является ли str Item, возможно, с функцией защиты типа. Если str не является элементом, вам даже не нужно использовать .includes(), потому что если str - это что-то еще, вы уже знаете, что оно не появится в массиве.
0 голосов
/ 26 марта 2020

Машинопись хочет, чтобы str также был Item const isInArray = (str: Item) => {

...