Как типизировать фунцкию, которая принимает массив кортежей, а возвращает массив строк в 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 шт):
.splice
- это метод массива, а не tuple. Поэтому он не может вывести тип результата основываясь на переданных параметрах. Вместо этого выводится общий тип элементов: string | number | boolean
.
Для решения нужно
либо не использовать
.splice
, а выбирать конкретный элемент, напримерel[0]
- в этом случае, корректно вычисляется тип возвращаемый.map
либо явно подсказать
typescript
какой тип ожидается, например с помощьюas
:
el.splice(0, 1) as [string]