TypeScript'te diziler iki ana şekilde tanımlanır: tip[] ve Array<tip>. Farklı türden elemanlara sahip diziler için birleştirilmiş türler (union types) veya demetler (tuples) kullanılır; bu, farklı tür ve sayıda elemanları tanımlamaya olanak tanır.
Dizi Tanımlamaları:
let numbers: number[] = [1, 2, 3]; let strings: Array<string> = ['a', 'b', 'c'];
Farklı Türdeki Elemanlardan Oluşan Dizi:
let mixed: (string | number)[] = [1, 'a', 2];
Demetler (tuples):
let tuple: [string, number, boolean] = ['hello', 42, true];
Demetlerle çalışmak, sabit bir yapı beklenildiğinde (örneğin bir fonksiyondan birden fazla farklı türde değer döndürmek) daha kolaydır, diziler ise eleman sayısı ve türünün karıştırılabileceği veya önceden bilinmediği durumlarda daha uygundur.
Demet tanımlandıktan sonra uzunluğu N olan bir demete eleman eklemek için push kullanabilir miyiz? Bu türleştirmeyi nasıl etkiler?
Cevap: Evet, demete push yapılabilir — derleyici buna izin verir, ancak bu demetin uzunluğu sınırlılığı varsayımını ihlal eder. Yeni elemanların türleri, demetin tüm olası türlerinin bir birleşimine dönüştürülecektir:
let tuple: [number, string] = [42, 'foo']; tuple.push(true); // TAMAM! tuple artık: [number, string, boolean], ama tür güncellenmedi, hata yok! console.log(tuple); // [42, 'foo', true]
Bu nedenle, demetlerle çalışmak ve değiştirilebilirliklerini elle kontrol etmek veya onları readonly yapmak önemlidir.
Hikaye
Geliştirici, [number, string] döndüren bir fonksiyonu tanımladı, ancak ardından sonuçta elemanlar eklemek için push kullanmaya başladı. Bu, türlerin senkronizasyonunu bozdu: sonraki kod tam olarak belirli türde iki eleman beklerken, değişken uzunlukta bir dizi aldı ve bu nedenle değerleri parçalayarak okumada çalışma zamanı hataları oluştu.
Hikaye
Farklı türdeki değerleri saklamak için any[] dizisi kullanıldı, bu da evrensel bir çözüm olarak düşünüldü. Sonuç olarak TypeScript, türlerin doğruluğunu kontrol etmeyi bıraktı ve uygulama mantığı, derleme hatası oluşturmadan yanlış tür dönüşümleri nedeniyle "bozulmaya" başladı.
Hikaye
Projede dizi ya tip[] ile ya da Array<tip> ile tanımlanıyordu — ama bazı yerlerde let arr: any[] ifadesinin kullanılması (her şeyle çalışmak için) müsaade ediliyordu. Bunun sonucunda kontrolsüz tür dönüşümleri ortaya çıktı, fonksiyon her tür diziyi kabul etti, bu da farklı türdeki elemanlar için hatalı yöntemler çağırma girişiminde çalışma zamanı hatalarına yol açtı.