Bir TypeScript dizi tipi, eleman tipi ve ardından [] şeklinde yazılır: string[] bir string dizisi, number[] bir sayı dizisidir. Generic yazılış Array<string> aynı tiptir. Bir diziye tip verildiğinde, eklediğiniz ve okuduğunuz her eleman o tipe sahiptir.
@ts-expect-error satırı bir derleme hatasıdır (TS2345). Burada blok yine de çalışsın diye beklenen hata olarak işaretlenmiştir; tipler silindiği için 42 çalışma zamanında gerçekten eklenir: çıktı bunu gösterir.
string[] ile Array<string>
| Yazılışı | Aynısı | Notlar |
|---|---|---|
string[] | Array<string> | Yaygın yazılış. |
(string | number)[] | Array<string | number> | Parantez şarttır: string | number[] "bir string ya da bir sayı dizisi" anlamına gelir. |
readonly string[] | ReadonlyArray<string> | push, pop, sort veya indekse atama yok. |
User[] | Array<User> | Nesne dizileri nesnenin tipini kullanır. |
string[][] | Array<Array<string>> | İki boyutlu bir dizi (ızgara). |
Bir kod tabanı için tek bir stil seçin. typescript-eslint'in array-type kuralı varsayılan olarak T[] biçimini ister.
Nesne Dizileri
Elemanı bir type alias veya interface ile tanımlayın, sonra Type[] kullanın. Diziden okunan her şey bu biçime göre kontrol edilir.
users dizisine eklenen bir nesne literal'i User tipiyle tam olarak eşleşmelidir: eksik bir admin ya da yanlış yazılmış bir özellik derleme hatasıdır.
Tipli map, filter, reduce ve find
Dizi metotları generic'tir, bu yüzden sonuçları tip taşır. Her metodun çalışma zamanında ne yaptığını JavaScript dizi metotları sayfası anlatıyor; TypeScript'in eklediği tiplerdir:
| Metot | T[] üzerindeki sonuç tipi |
|---|---|
map(fn) | U[], burada U fonksiyonun döndürdüğü tip |
filter(fn) | T[] (ya da daha dar bir tip, aşağıya bakın) |
find(fn) | T | undefined |
findIndex(fn), indexOf(x) | number (yoksa -1) |
some(fn), every(fn), includes(x) | boolean |
reduce(fn, init) | init değerinin tipi (veya tip argümanı, reduce<R>(...)) |
at(i) | T | undefined |
join(sep) | string |
Son örnek çalışır, çünkü TypeScript (5.5'ten beri) (n) => n !== undefined ifadesinin bir type predicate olduğunu çıkarır; bu yüzden filter, (number | undefined)[] yerine number[] döndürür. Çıkaramadığı kontroller için predicate'i kendiniz yazın: filter((x): x is User => x !== null).
Birden Fazla Tip Tutan Diziler
Bir union eleman tipi karışıma izin verir. Dizi tiplerinin bir union'ı ise izin vermez:
Konumların sabit tipleri olduğunda, örneğin bir [name, age] çifti, bunun yerine bir tuple kullanın: [string, number] 0. indeksin bir string, 1. indeksin bir sayı olduğunu bilir; (string | number)[] ise bilmez.
Readonly Diziler
readonly T[], diziyi değiştiren her metodu kaldırır. Bir fonksiyonun değiştirmemesi gereken parametreler ve sabitler için kullanın.
index.ts(3,12): error TS2339: Property 'push' does not exist on type 'readonly number[]'.
push satırını silin, blok 4 yazdırır. Değiştirilebilir bir number[] her zaman readonly number[] beklenen yere verilebilir, bu yüzden readonly parametrelerin çağıranlara hiçbir maliyeti yoktur. Kontrol yalnızca derleme zamanındadır: çalışma zamanında sıradan bir dizidir. Readonly bir diziyi sıralamak için bir kopyasını sıralayın: [...values].sort().
Literal Dizilerde includes Tuzağı
as const bir diziyi literal tiplerden oluşan readonly bir tuple'a dönüştürür. İzin verilen değerlerin bir listesi için kullanışlıdır, ama o zaman includes metodu yalnızca bu literal'leri kabul eder:
Kontrolü bir type guard (value is Color) içine almak, genişletmenin bir kez yapılması ve çağıranların daraltılmış bir değer geri alması anlamına gelir.
İndeksleme ve Boş Diziler
arr[i] okumak, i aralık dışında olsa ve çalışma zamanındaki değer undefined olsa bile T tipini verir. at(i) ise T | undefined olarak tiplenmiştir; noUncheckedIndexedAccess derleyici seçeneği de düz indekslemenin T | undefined döndürmesini sağlar.
queue[0].toUpperCase() derlenir ve ardından çalışma zamanında bir TypeError fırlatırdı. Bir indeks eksik olabiliyorsa at(), bir uzunluk kontrolü ya da noUncheckedIndexedAccess tercih edin.
Sıkça Sorulan Sorular
TypeScript'te bir dizi tipi nasıl tanımlanır?
Eleman tipini yazıp ardından [] ekleyin: let names: string[] = ["a", "b"]. Generic biçim Array<string> tamamen aynı anlama gelir. Bir nesne dizisi için eleman tipi olarak bir nesne tipi veya interface kullanın: User[].
string[] ile Array<string> arasındaki fark nedir?
Yok: aynı tipin iki yazılışıdır. string[] daha yaygındır. Karmaşık eleman tiplerinde generic biçim daha okunaklıdır; readonly diziler için de readonly string[] ile ReadonlyArray<string> aynıdır.
TypeScript'te find neden undefined döndürüyor?
array.find(), hiçbir şey eşleşmeyebileceği için T | undefined döndürür. strict altında sonucu kullanmadan önce undefined durumunu bir if kontrolü, optional chaining (found?.name) ya da bir varsayılan değerle (found ?? fallback) ele almanız gerekir.
TypeScript'te birden fazla tip içeren bir diziye nasıl tip verilir?
Parantez içinde bir union eleman tipi kullanın: (string | number)[], her elemanı bir string ya da bir sayı olan bir dizidir. Bu, ya yalnızca string'lerden ya da yalnızca sayılardan oluşan bir dizi anlamına gelen string[] | number[] tipinden farklıdır. [string, number] gibi sabit bir tip sırası için bir tuple kullanın.
as const bir dizide includes neden hata veriyor?
as const bir dizide includes neden hata veriyor?["red", "green"] as const gibi literal'lerden oluşan readonly bir dizinin metodu includes(searchElement: "red" | "green") imzasına sahiptir, bu yüzden düz bir string vermek TS2345 hatasıdır. Kontrol için diziyi genişletin, (COLORS as readonly string[]).includes(input), tercihen input değerini literal union'a daraltan bir type guard içinde.