Как решить, что ‘T’ может быть создан с произвольным типом, который может быть не связан с ‘T[]’?

#javascript #reactjs #typescript

#javascript #reactjs #typescript

Вопрос:

Я нашел эту функцию:

 function sliceIntoChunks(arr, chunkSize) {
  const res = [];
  for (let i = 0; i < arr.length; i  = chunkSize) {
    const chunk = arr.slice(i, i   chunkSize);
    res.push(chunk);
  }
  return res;
}
 

и я хочу ввести его:

 export const sliceIntoChunks = <T>(
  arr: Array<T>,
  chunkSize: number
): Array<T> => {
  const res: T[] = [];

  for (let i = 0; i < arr.length; i  = chunkSize) {
    const chunk = arr.slice(i, i   chunkSize);
    res.push(chunk);
  }
  return res;
};
 

Получение ошибки здесь: res.push(chunk);

ошибка:

Аргумент типа ‘T[]’ не может быть присвоен параметру типа ‘T’.
‘T’ может быть создан с произвольным типом, который может быть не связан с ‘T[]’.

Как мне это правильно реализовать?

Ответ №1:

Результирующий массив будет представлять собой массив массивов, поэтому:

 const sliceIntoChunks = <T>(
  arr: Array<T>,
  chunkSize: number
): Array<T[]> => {
  const res = [];

  for (let i = 0; i < arr.length; i  = chunkSize) {
    const chunk = arr.slice(i, i   chunkSize);
    res.push(chunk);
  }
  return res;
};
 

Игровая площадка

Ответ №2:

Array.prototype.slice возвращает массив, подмножество arr . Итак, если arr имеет тип Array<T> , то chunk тоже. Но res также имеет тип Array<T> (или эквивалент T[] ), поэтому res.push ожидает аргумент типа T , а не Array<T> .

Попробуйте изменить тип res from T[] на T[][] .