ReadonlyArray<Type>
Tablica tylko do odczytu: bez push, sort i przypisań po indeksie.
Przykład
#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)[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
#const lista: ReadonlyArray<Typ> = […]
const lista2: readonly Typ[] = […]Parametry typu
#Type
dowolny typ
Typ elementów tablicy.
Więcej przykładów
#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[]'.
}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 zas const. - Do sortowania bez mutacji użyj kopii
[...lista].sort()albo metodytoSorted(), która wymaga wlibwersjiES2023. ReadonlyArraydziała płytko: obiekty w tablicy nadal można modyfikować. Żeby zablokować także ich pola, użyjReadonlyArray<Readonly<T>>.
Powiązane hasła
#- Tablice: number[] i Array<T>Typy tablic, w których wszystkie elementy mają ten sam typ.
- Readonly<Type>Tworzy typ, w którym wszystkie właściwości są tylko do odczytu.
- readonlyModyfikator blokujący zmianę pola po utworzeniu obiektu.
- as constZamraża literały w wyrażeniu: najwęższe typy i pola tylko do odczytu.
- Krotki (tuple)Tablice o stałej długości, w których każda pozycja ma własny typ.
Widzisz błąd albo brakuje przykładu? Napisz do nas.