ReadonlyArray<Type>

Tablica tylko do odczytu: bez push, sort i przypisań po indeksie.

Na tej stronie

Przykład

#
TypeScript
function topScores(scores: ReadonlyArray<number>, count: number): number[] {
  return [...scores].sort((a, b) => b - a).slice(0, count)
}

const results: ReadonlyArray<number> = [72, 95, 64, 88]
console.log(topScores(results, 2))
console.log(results)
Wynik
[95, 88]
[72, 95, 64, 88]

Definicja i zastosowanie

#

ReadonlyArray<Type> opisuje tablicę, której nie można zmieniać. Nie ma metod modyfikujących, takich jak push, pop, splice, sort czy reverse, a przypisanie scores[0] = … kończy się błędem. Zostają metody, które tylko czytają albo tworzą nową tablicę: map, filter, slice, includes, join.

Krótszy, równoważny zapis to readonly Type[] i właśnie tak kompilator pokazuje ten typ w komunikatach. Wybierz jeden styl w projekcie. ReadonlyArray bywa czytelniejszy przy złożonych elementach, np. ReadonlyArray<string | number> zamiast readonly (string | number)[].

Zwykłą tablicę można przekazać tam, gdzie oczekiwana jest tablica tylko do odczytu, ale nie odwrotnie. Parametr typu ReadonlyArray<T> to więc obietnica: funkcja przyjmie każdą tablicę i niczego w niej nie zmieni. Ochrona działa tylko podczas kompilacji, w działającym programie to zwykła tablica.

Składnia

#
Składnia
const lista: ReadonlyArray<Typ> = […]
const lista2: readonly Typ[] = […]

Parametry typu

#
  • Type

    dowolny typ

    Typ elementów tablicy.

Więcej przykładów

#
Zablokowane zmiany
TypeScript
function resetFirst(scores: ReadonlyArray<number>) {
  scores[0] = 0
  // Błąd: Index signature in type 'readonly number[]' only permits reading.
  scores.sort()
  // Błąd: Property 'sort' does not exist on type 'readonly number[]'.
}
Przekazanie do funkcji, która zmienia tablicę
TypeScript
function addBonus(scores: number[]) {
  scores.push(10)
}

addBonus(results)
// Błąd: Argument of type 'readonly number[]' is not assignable to parameter of type 'number[]'.
//   The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.

Dobre praktyki

#
  • Typuj parametry jako ReadonlyArray<T>, jeśli funkcja nie zmienia tablicy. Przyjmie wtedy również tablice tylko do odczytu, np. stałe utworzone z as const.
  • Do sortowania bez mutacji użyj kopii [...lista].sort() albo metody toSorted(), która wymaga w lib wersji ES2023.
  • ReadonlyArray działa płytko: obiekty w tablicy nadal można modyfikować. Żeby zablokować także ich pola, użyj ReadonlyArray<Readonly<T>>.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.