← Назад к вопросам

Какого типа будет часть массива, полученная с помощью slice?

1.0 Junior🔥 151 комментариев
#Коллекции и структуры данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Тип части массива, полученной с помощью slice

В JavaScript/TypeScript метод slice() возвращает поверхностную копию (shallow copy) части массива в виде нового массива. Это означает, что тип результата всегда будет Array (или более конкретно — массив того же типа элементов, что и исходный массив).

Ключевые особенности slice()

  1. Не изменяет исходный массив — создаёт новый массив.
  2. Тип элементов сохраняется — если исходный массив содержит элементы типа T, то результат будет иметь тип T[].
  3. Поверхностное копирование — при копировании объектов или массивов внутри исходного массива, в новый массив попадут ссылки на те же объекты, а не их глубокие копии.

Примеры в TypeScript

// Пример 1: Массив чисел
const numbers: number[] = [1, 2, 3, 4, 5];
const slicedNumbers = numbers.slice(1, 4);
// Тип slicedNumbers: number[]
console.log(slicedNumbers); // [2, 3, 4]

// Пример 2: Массив строк
const strings: string[] = ['a', 'b', 'c', 'd'];
const slicedStrings = strings.slice(2);
// Тип slicedStrings: string[]
console.log(slicedStrings); // ['c', 'd']

// Пример 3: Массив объектов (поверхностное копирование)
interface User {
  id: number;
  name: string;
}
const users: User[] = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  { id: 3, name: 'Charlie' }
];
const slicedUsers = users.slice(0, 2);
// Тип slicedUsers: User[]
console.log(slicedUsers[0] === users[0]); // true (та же ссылка на объект)

Сравнение с splice()

Важно не путать slice() с методом splice(), который изменяет исходный массив и возвращает удалённые элементы:

const arr = [10, 20, 30, 40];
const spliced = arr.splice(1, 2); // Удаляет 2 элемента начиная с индекса 1
// Тип spliced: number[] (но массив arr теперь [10, 40])

Особенности для кортежей (Tuples) в TypeScript

TypeScript корректно определяет типы даже для кортежей:

const tuple: [string, number, boolean] = ['test', 42, true];
const slicedTuple = tuple.slice(1); 
// Тип slicedTuple: (string | number | boolean)[]
// TypeScript "расширяет" тип до объединения, так как длина кортежа меняется

Заключение

Часть массива, полученная через slice(), всегда имеет тип массива (Array), идентичного по типу элементов исходному массиву. Метод гарантирует иммутабельность исходных данных и является безопасным для функционального программирования. В TypeScript система типов корректно выводит результат, сохраняя тип элементов, но для кортежей может происходить расширение до объединения типов из-за динамической длины результата.