Ders 01 / 23
TypeScript'in Amacı
Statik tip katmanının yakaladığı hata sınıfı, tiplerin derleme anında silinmesi ve tip denetimi ile çalışma zamanı doğrulaması arasındaki ayrım.
İçindekiler
Modüller, Araçlar ve Ekosistem kursu, kaynak kodun hedef ortama uyarlanmasını ve statik çözümleme araçlarının kural kümesiyle nasıl çalıştığını ele aldı. Bu araçların tümü ortak bir soru sorar: programı çalıştırmadan hakkında ne söylenebilir? TypeScript, bu sorunun en iddialı yanıtını verir — programın her ifadesinin hangi değer kümesinden değer üretebileceğini hesaplar ve tutarsızlıkları bildirir.
Bu ders üç şeyi kurar: tip katmanının hangi hata sınıfını yakaladığı, tiplerin çalışma zamanında ne olduğu ve tip denetiminin neyi vaat etmediği. Üçüncüsü, ilk ikisi kadar önemlidir; kursun ilerleyen bölümlerinde tekrar tekrar bu ayrıma dönülecektir.
Kurs boyunca tek bir somut örnek kullanılacaktır: bir ölçüm kaydı modeli. Model, tipsiz bir JavaScript nesnesinden başlar ve her konuda bir adım daha güvenli hâle gelir.
Sessiz Hatanın Anatomisi
Ölçüm kayıtlarının ortalamasını hesaplayan bir fonksiyonla başlayalım. JavaScript Temelleri kursunda kurulan araçlardan fazlasını kullanmıyor:
function ortalama(olcumler) { let toplam = 0; for (const o of olcumler) { toplam += o.deger; } return toplam / olcumler.length; } const kayitlar = [{ deger: 21.4 }, { deger: 22.1 }, { deger: "23.0" }]; console.log(ortalama(kayitlar));
Çalıştırıldığında çıktı NaN olur. Program çökmez, hata iletisi vermez, yanlış bir sayı
üretir. Nedeni Programlama Temelleri kursundaki Tip Dönüşümü dersinde kurulmuştu: üçüncü
kaydın deger alanı sayı değil dizgidir; + işleci bir tarafı dizgi görünce toplama
değil birleştirme yapar. 43.5 + "23.0" ifadesi "43.523.0" dizgisini verir, bu dizginin
üçe bölümü de NaN olur.
Bu, mantık hatası sınıfının tipik bir örneğidir: program çalışır, hata vermez, yanlış
sonuç verir. Hatanın kaynağı ile belirtisi arasında bir mesafe vardır — kayıt belki
saatler önce bir dosyadan okunmuş, NaN ise bir raporun sonunda görünmüştür.
Tip Katmanı Ne Yapar
Aynı programı, değerlerin hangi kümeye ait olduğunu açıkça yazarak kuralım:
type Olcum = { deger: number }; function ortalama(olcumler: Olcum[]): number { let toplam = 0; for (const o of olcumler) { toplam += o.deger; } return toplam / olcumler.length; } const kayitlar: Olcum[] = [{ deger: 21.4 }, { deger: 22.1 }, { deger: "23.0" }]; console.log(ortalama(kayitlar));
: Olcum[] ve : number yazımlarına tip açıklaması (type annotation) denir. Derleyici
bu dosyayı denetlediğinde şu tanıyı üretir:
a1.ts(11,64): error TS2322: Type 'string' is not assignable to type 'number'.
Tanı, hatanın nerede olduğunu değil, nereden başladığını gösterir: NaN’ın oluştuğu
bölme işlemini değil, dizginin sayı beklenen yere konduğu satır ve sütunu. Hata, belirtiye
dönüşmeden önce yakalanmıştır.
Bu kurstaki tanı iletileri derleyicinin 6.0 sürümüyle üretilmiştir. İleti metni sürümden
sürüme yeniden yazılabilir; TS2322 gibi hata kodları daha kararlıdır. Bir tanıyı
aratırken kod üzerinden aramak, metin üzerinden aramaktan güvenilirdir.
Tipler Derleme Anında Silinir
Şimdi kursun en önemli ayrımına gelelim. TypeScript kaynak kodu doğrudan çalışmaz; önce JavaScript’e çevrilir. Bu çeviride tip açıklamalarına ne olur?
Aşağıdaki dosya olcum.ts adıyla kaydedilsin:
type Olcum = { kimlik: string; deger: number }; function ortalama(olcumler: Olcum[]): number { let toplam: number = 0; for (const o of olcumler) { toplam += o.deger; } return toplam / olcumler.length; } const kayitlar: Olcum[] = [ { kimlik: "s-01", deger: 21.4 }, { kimlik: "s-02", deger: 22.1 }, ]; console.log(ortalama(kayitlar));
Derleyici tsc --target es2022 olcum.ts komutuyla çağrıldığında yanına olcum.js
dosyasını yazar:
"use strict"; function ortalama(olcumler) { let toplam = 0; for (const o of olcumler) { toplam += o.deger; } return toplam / olcumler.length; } const kayitlar = [ { kimlik: "s-01", deger: 21.4 }, { kimlik: "s-02", deger: 22.1 }, ]; console.log(ortalama(kayitlar));
Çıktı, kaynağın tip açıklamaları silinmiş hâlidir. type Olcum bildirimi tamamen yok
olmuştur; : Olcum[], : number yazımları kalkmıştır. Derleyicinin eklediği tek satır
"use strict";dir ve o da tiplerle ilgili değildir. node olcum.js çıktısı 21.75tir.
Buna tip silme (type erasure) denir. Sonucu şudur: tip katmanı çalışma zamanı davranışını değiştirmez. Aynı programın tipli ve tipsiz sürümleri, tip hatası içermedikleri sürece bit bit aynı işi yapar. Tip sistemi bir kütüphane değil, bir kanıt katmanıdır: kaynak kod üzerinde yürütülen ve çeviri bittiğinde geride kalmayan bir akıl yürütme.
Bu ayrımın doğrudan bir sonucu, tip hatasının kendiliğinden yayını durdurmamasıdır:
kayit.ts(3,40): error TS2322: Type 'string' is not assignable to type 'number'.
Bu tanıyı üreten derleme, yine de kayit.js dosyasını yazar ve o dosya çalıştırılabilir.
Derleyici “bu programın tipleri tutarsız” der, “bu program çalışmaz” demez. Hatanın yayını
engellemesi ayrı bir yapılandırma kararıdır ve Derleme ve Çalıştırma Akışı dersinde ele
alınacaktır.
Tip Denetimi Çalışma Zamanı Doğrulaması Değildir
Tip silme, sık yapılan bir yanlış beklentiyi de açıklar. Bir değerin tipini yazmak, o değerin çalışma zamanında gerçekten o tipte olacağını garanti etmez. Garanti, yalnızca derleyicinin gördüğü kod parçası için ve yalnızca oradaki bilgi doğruysa geçerlidir.
Ölçüm kaydı bir dosyadan veya ağdan geldiğinde bilgi doğru olmayabilir:
type Olcum = { kimlik: string; deger: number }; const ham = '{"kimlik":"s-01","deger":"23.0"}'; const olcum = JSON.parse(ham) as Olcum; console.log(typeof olcum.deger); console.log(olcum.deger.toFixed(1));
Bu dosya tip denetiminden hatasız geçer. Çalıştırıldığında ise:
string TypeError: olcum.deger.toFixed is not a function
JSON.parse çağrısının dönüş tipi anydir; as Olcum yazımı derleyiciye “bu değeri
Olcum say” demektir. Derleyici bu bildirimi sorgulamaz, çünkü sorgulayacak bir aracı
yoktur: dizginin içeriği ancak program çalışırken bilinir.
Buradan iki kural çıkar ve kurs boyunca geçerlidir:
- Sistem sınırında doğrulama yapılır. Dosya, ağ, kullanıcı girdisi ve veri tabanından gelen veri, tipi bildirilerek değil, alan alan sınanarak kabul edilir.
- Tip iddiası (type assertion) bir kanıt değil, bir borçtur.
asyazımı denetimi susturur; susturulan yerin doğruluğundan programcı sorumludur.
Sınır doğrulaması yazmanın araçları bu kursun ilerleyen derslerinde kurulacaktır:
unknown tipi doğru başlangıç noktasını verir, tip yüklemleri doğrulamanın sonucunu tip
sistemine geri bildirir.
Tip Sistemi Neyi Kanıtlar
Bir tip sistemi, programın çalıştırılmadan doğrulanabilen özelliklerini kanıtlar. TypeScript’in kanıtladığı özellik kabaca şudur: her ifadenin değeri, kendisinden beklenen kümenin içindedir. Bu kanıt, tüm bir hata sınıfını ortadan kaldırır — var olmayan bir alana erişim, eksik argümanla çağrı, yanlış tipte atama, birleşim tiplerinde ele alınmamış durum.
Kanıtlamadığı şeyler de aynı ölçüde nettir:
- Değer aralığı.
deger: numberbildirimi, sıcaklığın fizik olarak olanaklı bir aralıkta olduğunu söylemez. - Sonlanma ve doğruluk. Bir fonksiyonun ortalamayı doğru hesapladığı tip düzeyinde ifade edilemez; bu, Algoritmalar kursundaki kısmi doğruluk ve sonlanma kavramlarının alanıdır.
- Dış dünyanın biçimi. Yukarıdaki örnekte görüldüğü gibi, sınırın ötesi denetlenmez.
Ayrıca TypeScript’in tip sistemi bilinçli olarak tam güvenilir değildir: any, tip
iddiaları ve birkaç dil özelliği, sistemin verdiği güvenceyi delen kaçış kapıları bırakır.
Bunun nedeni tasarım hedefidir — dil, var olan JavaScript kodunun üzerine kademeli olarak
eklenebilmelidir. Kaçış kapıları any, unknown ve never dersinde tek tek ele
alınacaktır.
Kursun Ortak Örneği
Kurs boyunca aynı model üzerinde çalışılacaktır. Başlangıç noktası, hiçbir güvence taşımayan bu nesnedir:
const olcum = { kimlik: "s-01", sensor: "sicaklik", deger: 21.4, birim: "C", zaman: 1706000000000, };
Bu nesne hakkında şu an hiçbir şey bilinmiyor: birim alanına herhangi bir dizgi
yazılabilir, deger alanı dizgi olabilir, sensor alanı silinebilir. Her konu bu
belirsizliklerden birini kapatacaktır — önce alanların tipleri, sonra alanlar arasındaki
bağıntılar, sonra kaydın geçtiği durumlar ve en sonunda modelin proje sınırında nasıl
yayımlanacağı.
Özet
- Statik tip katmanı, programı çalıştırmadan her ifadenin değer kümesini hesaplar ve tutarsızlıkları derleme anında bildirir.
- Tanı iletileri sürümle değişebilir;
TS2322gibi hata kodları daha kararlı bir başvurudur. - Tipler derleme anında silinir: derlenmiş JavaScript çıktısı, kaynağın tip açıklamaları çıkarılmış hâlidir ve çalışma zamanı davranışı değişmez.
- Tip hatası, yayını kendiliğinden durdurmaz; derleyici tanı üretse de JavaScript dosyasını yazar.
- Tip bildirmek çalışma zamanı doğrulaması değildir; sistem sınırından gelen veri alan alan sınanmalıdır.
- Tip sistemi değer aralığını, algoritmanın doğruluğunu ve dış dünyanın biçimini kanıtlamaz.
Sonraki Adım
Tip katmanının ne yaptığı belli oldu; sırada bu katmanın söz dağarcığı var. Ölçüm kaydının
alanlarını yazabilmek için önce hangi temel tiplerin bulunduğunu bilmek gerekir: ilkel
tipler, dizi ve demet gösterimleri ile sabit bir değer kümesini adlandıran enum yapısı.
Sonraki ders bunları kurar ve modelin ilk tipli sürümünü yazar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.