Как написать в машинописи функцию indexOf для массивов? - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь использовать функцию arr.indexOf с Typescript:

const index: number = batches.indexOf((batch: BatchType) => (batch.id === selectedBatchId))

BatchType имеет следующий тип:

export default interface BatchType {
  id: number,
  month: number,
  year: number
}

batches происходят из контекста, без типов:

const initState = {
  dance: {
    id: '',
    name: ''
  },
  level: {
    id: '',
    name: '',
    schedule: ''
  },
  batches: []
}

Я использую это initState в хуке useState:

const [level, setLevel] = useState (initState)

В моем компонент, я использую batches внутри level объекта.

Я получаю следующую ошибку:

TS2345: Argument of type '(batch: BatchType) => boolean' is not assignable to parameter of type 'never'.

Почему обрабатывается тип, включающий => boolean. Куда он жалуется? Кто типа never? batches? batch?

У меня было ощущение, что проблема связана с объектом batches, что в провайдере я не использую типы, но Typescript не жалуется на этот объект.

1 Ответ

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

Встроенный метод массива indexOf не принимает обратный вызов в качестве аргумента, он принимает элемент для поиска в массиве. Если элемент содержится в массиве, он вернет первый индекс этого элемента, если элемент не находится в массиве, он вернет -1.

From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf :

const beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];

console.log(beasts.indexOf('bison'));
// expected output: 1

Таким образом, машинописный текст жалуется на то, что вы указываете indexOf аргумент неправильного типа: вы даете ему предикат с типом (batch: BatchType) => boolean.

Я не совсем конечно, насчет never - но поскольку typcript пытается вывести типы, я предполагаю, что аргумент indexOf выводится как «член массива: []». Поскольку в пустом массиве нет члена, тип определяется как never. Кто-нибудь знает это наверняка?

...