Как типизировать фунцкию, которая принимает массив кортежей, а возвращает массив строк в typescript

Есть функция, которая принимает массив массивов пользователей и возвращает массив имен пользователей, которые подходят под условия фильтрации. Подскажите, как правильно ее типизировать, так как ts выдает ошибку

type TUser = [string, number, boolean][];
const users: TUser = [
  ["Alice", 25, true],
  ["Bob", 30, false],
  ["Charlie", 22, true],
  ["David", 27, true],
  ["Eve", 20, false],
  ["Fanny", 29, true],
  ["George", 67, true],
];

function filterAndSortUsers(arr: TUser): string[] {
  let filtArr: TUser = arr.filter((item) => item[1] >= 25 && item[2] === true);
  let sortedArr: TUser= filtArr.sort(function (a, b) {
    return a[1] - b[1];
  });
  let newArr: string[] = sortedArr.map((el) => el.splice(0, 1)).flat();

  return newArr;
}

Текст ошибки: Тип "(string | number | boolean)[]" не может быть назначен для типа "string[]". Тип "string | number | boolean" не может быть назначен для типа "string". Тип "number" не может быть назначен для типа "string".


Ответы (1 шт):

Автор решения: Grundy

.splice - это метод массива, а не tuple. Поэтому он не может вывести тип результата основываясь на переданных параметрах. Вместо этого выводится общий тип элементов: string | number | boolean.

Для решения нужно

  • либо не использовать .splice, а выбирать конкретный элемент, например el[0] - в этом случае, корректно вычисляется тип возвращаемый .map

  • либо явно подсказать typescript какой тип ожидается, например с помощью as:
    el.splice(0, 1) as [string]

→ Ссылка