Ders 23 / 23
Derleme ve Çalıştırma Akışı
Tip denetimi ile yayın çıktısının ayrılması, hata durumunda yayın davranışı, dosya başına çeviriyi olanaklı kılan seçenekler, tip-yalnızca içe aktarma ve tip soyan çalışma zamanları.
İçindekiler
Kurs boyunca derleyici hem tip denetimi yaptı hem çıktı üretti. Bu iki işin ayrılması, projelerin derleme süresini ve dağıtım düzenini belirleyen bir karardır.
Ayrımın gerekçesi ilk derste kurulmuştu: tipler derleme anında silinir. Silme işlemi mekanik ve hızlıdır; tip denetimi ise programın tümünü çözümlemeyi gerektirir ve yavaştır. İki işi ayırmak, geliştirme döngüsünü kısaltır.
Hata Durumunda Yayın
İlk derste görülen davranışı bir proje bağlamında yeniden inceleyelim. src/ana.ts:
const deger: number = "21.4"; console.log(deger);
Yapılandırma outDir ile çıktı üretecek biçimde ayarlanmışsa, derleme şu tanıyı verir:
src/ana.ts(1,7): error TS2322: Type 'string' is not assignable to type 'number'.
ve buna rağmen dist/ana.js dosyasını yazar:
const deger = "21.4"; console.log(deger); export {};
noEmitOnError seçeneği bu davranışı değiştirir; aynı derleme tanıyı verir ve dist
dizini hiç oluşmaz.
Hangisinin isteneceği bağlama bağlıdır. Geliştirme sırasında, tip hatası olan bir kodu yine de çalıştırabilmek yararlıdır — hata bir modülde, denenen davranış başka bir modüldedir. Yayın hattında ise tersi geçerlidir: denetimden geçmeyen kod paketlenmemelidir. Bu nedenle iki ayrı yapılandırma kullanmak yaygındır.
Sondaki export {}; satırı ayrı bir ayrıntıdır: derleyici, dosyayı modül olarak işaretlemek
için ekler. Modül Çözümleme dersindeki moduleDetection ayarı bu davranışı belirler.
İki Adıma Ayırma
Ayrım, iki komutla kurulur:
- Tip denetimi:
tsc --noEmit. Çıktı üretmez, yalnızca tanıları verir. - Çıktı üretimi: Dosya başına çalışan bir çevirici. Tipleri siler, sözdizimini hedefe uyarlar, tip denetimi yapmaz.
İkinci adımın hızlı olmasının nedeni, dosya başına çalışabilmesidir: bir dosyayı çevirmek için başka dosyalara bakmaya gerek yoktur. Ancak bu, TypeScript’in bazı yazımlarında olanaksızdır — çevirinin doğru olması için tip bilgisi gerekir.
isolatedModules seçeneği, bu yazımları yakalar. Aşağıdaki src/olcum.ts:
export interface Olcum { kimlik: string; deger: number; } export function ortalama(kayitlar: readonly Olcum[]): number { return kayitlar.length === 0 ? 0 : kayitlar.reduce((t, k) => t + k.deger, 0) / kayitlar.length; }
ve src/ana.ts:
import { Olcum, ortalama } from "./olcum.js"; export { Olcum }; const kayitlar: Olcum[] = [{ kimlik: "s-01", deger: 21.4 }]; console.log(ortalama(kayitlar));
isolatedModules açıkken:
src/ana.ts(3,10): error TS1205: Re-exporting a type when 'isolatedModules' is enabled requires using 'export type'.
Sorun şudur: dosya başına çalışan bir çevirici, Olcum adının bir tip mi yoksa bir değer
mi olduğunu bilemez. Tipse dışa aktarma satırı tümüyle silinmeli, değerse korunmalıdır.
Karar için olcum.ts dosyasına bakmak gerekir ve bu, dosya başına çeviriyi bozar.
verbatimModuleSyntax seçeneği aynı kuralı içe aktarmalara da uygular:
src/ana.ts(1,10): error TS1484: 'Olcum' is a type and must be imported using a type-only import when 'verbatimModuleSyntax' is enabled. src/ana.ts(3,10): error TS1205: Re-exporting a type when 'verbatimModuleSyntax' is enabled requires using 'export type'.
Düzeltme, tip-yalnızca yazımları kullanmaktır:
import type { Olcum } from "./olcum.js"; import { ortalama } from "./olcum.js"; export type { Olcum }; const kayitlar: Olcum[] = [{ kimlik: "s-01", deger: 21.4 }]; console.log(ortalama(kayitlar));
Bu dosya hatasız derlenir. Üretilen dist/ana.js:
import { ortalama } from "./olcum.js"; const kayitlar = [{ kimlik: "s-01", deger: 21.4 }]; console.log(ortalama(kayitlar));
node dist/ana.js çıktısı 21.4tür.
import type yazımı, satırın tümüyle silineceğini bildirimde söyler. Kazanç yalnızca
hız değildir: içe aktarmanın yan etkisi olan bir modülden yalnızca tip almak, çıktıda o
modülün yüklenmesine yol açmaz. Modüller, Araçlar ve Ekosistem kursundaki ağaç sarsma
konusuyla aynı ilkedir — silinebilecek bağımlılığın silinebilir olduğunun bilinmesi.
Artımlı Derleme
incremental seçeneği, derleyicinin önceki çalışmasından kalan bilgiyi bir dosyaya
yazmasını sağlar. Sonraki derlemede yalnızca değişen dosyalar ve onlara bağlı olanlar
yeniden çözümlenir.
Seçenek açıkken proje kökünde tsconfig.tsbuildinfo adlı bir dosya oluşur. Bu dosya
üretilen bir yapıdır; sürüm kontrolüne alınmaz ve temizlik adımlarında silinir. Yeri
tsBuildInfoFile ile değiştirilebilir.
İzleme kipi (tsc --watch) aynı düşünceyi sürekli çalışan bir sürece taşır: dosya
değişiklikleri izlenir ve yalnızca etkilenen bölüm yeniden denetlenir. Geliştirme
sırasında bu kip, tek seferlik derlemeye yeğlenir.
Tip Soyan Çalışma Zamanları
Bazı çalışma zamanları TypeScript dosyalarını doğrudan çalıştırabilir: tip açıklamalarını söker ve kalan JavaScript’i yürütür. Bu, ilk dersteki tip silme ilkesinin çalışma zamanına taşınmış hâlidir.
Ayrımı görmek gerekir. Aşağıdaki dosya bir tip hatası içerir:
const deger: number = "21.4"; console.log(deger);
Böyle bir çalışma zamanında dosya çalışır ve 21.4 yazar. Hiçbir tip denetimi
yapılmaz. Soyma işlemi mekaniktir; derleyicinin verdiği güvenceyle ilgisi yoktur.
İkinci sınır, kod üreten TypeScript yazımlarında görülür:
enum Birim { Celsius = "C", } console.log(Birim.Celsius);
Bu dosya çalışmaz:
SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]: TypeScript enum is not supported in strip-only mode
Temel Tipler dersinde numaralandırmanın tip silme ilkesinin istisnası olduğu gösterilmişti; sonucu burada somutlaşır. Yalnızca silme yapan bir çalışma zamanı, silinemeyen sözdizimi çalıştıramaz. Aynı kısıt parametre özelliklerini de kapsar.
Bu nedenle erasableSyntaxOnly seçeneği, tip soyan bir çalışma zamanı hedefleyen
projelerde açık tutulur: silinemeyen yazımlar derleme anında bildirilir, çalışma zamanında
sürprize dönüşmez.
Üç yolun karşılaştırması:
| Yol | Tip denetimi | Hız | Kısıt |
|---|---|---|---|
| Derleyiciyle derleme | Var | Düşük | — |
| Ayrı denetim + dosya başına çeviri | Ayrı adımda | Yüksek | isolatedModules gerekir |
| Tip soyan çalışma zamanı | Yok | Yüksek | Silinemeyen yazım çalışmaz |
Üçünün ortak yanı, tip denetiminin kaybolmaması gerektiğidir. İkinci ve üçüncü yolda denetim bir yerde — yayın hattında, düzenleyicide, işleme öncesi bir kancada — yapılmalıdır. Yapılmadığında geriye kalan, tip açıklaması yazılmış JavaScript’tir.
Özet
- Tip hatası kendiliğinden yayını durdurmaz;
noEmitOnErrorbunu değiştirir ve geliştirme ile yayın için ayrı yapılandırmalar yaygındır. - Tip denetimi (
tsc --noEmit) ile çıktı üretimi ayrı adımlara bölünebilir; ikinci adımın hızı dosya başına çalışabilmesinden gelir. isolatedModulesveverbatimModuleSyntax, dosya başına çeviriyi bozan yazımları bildirir; düzeltmeimport typeveexport typeyazımlarıdır.incrementalseçeneği derleme bilgisini bir dosyaya yazar; bu dosya üretilmiş bir yapıdır ve sürüm kontrolüne alınmaz.- Tip soyan çalışma zamanları hiçbir tip denetimi yapmaz ve silinemeyen yazımları
çalıştıramaz;
erasableSyntaxOnlybu yazımları derleme anında yakalar.
Kurs Kapanışı
Kurs, tek bir soruyla başladı: bir program çalıştırılmadan hakkında ne söylenebilir? TypeScript’in yanıtı, kaynak kod üzerine kurulan ve çeviri bittiğinde geride kalmayan bir kanıt katmanıydı.
Bu katmanın sınırları baştan çizildi ve her konuda yeniden sınandı. Tipler derleme anında
silinir; çalışma zamanı davranışını değiştirmez; dış dünyanın biçimini kanıtlamaz. Bu
kısıtlar bir eksiklik değil, katmanın ne olduğunun tanımıdır — ve paths ayarının
çalışmayan çıktısı ile tip soyan çalışma zamanının denetimsizliği, aynı kısıtın iki farklı
görünümüdür.
Kurs boyunca tek bir model taşındı. Ölçüm kaydı, hiçbir güvence taşımayan bir JavaScript nesnesinden başladı; alanları tiplendi, birimi kapalı bir kümeye bağlandı, geçerli ve hatalı durumları ayırt edici bir birleşimle ayrıldı, kaynağı bir arayüzle soyutlandı, defteri bir tip parametresiyle genelleştirildi, türevleri eşlenmiş ve koşullu tiplerle hesaplandı, sınırı bir tip yüklemiyle korundu ve son olarak bir paket bildirimiyle dışa verildi. Her adımda kazanılan şey aynıydı: çalışma zamanında ortaya çıkacak bir sorunun derleme anına taşınması.
Kurstan çıkarılacak üç ilke:
Kanıt sınırda üretilir. Sistem sınırından gelen veri unknown olarak alınır, çalışma
zamanında sınanır ve sonuç tip yüklemiyle kaydedilir. as yazımı bir kanıt değil bir
borçtur.
Model tek yerde durur. Türev tipler elle yazılmaz, asıl tipten hesaplanır; sabit listeler hem değer hem tip olarak tek kaynaktan gelir. Modelin büyümesi, onu kullanan kodun gözden geçirilmesini derleyici aracılığıyla zorunlu kılar.
Katılık bir tercih değil, bir kapsam kararıdır. Her bayrak bir hata sınıfına karşılık gelir; kapalı bırakılan bayrak, o sınıfın çalışma zamanına bırakılması demektir.
Sırada, bu kodun çalışacağı yer var. Node.js Çalışma Zamanı kursu sunucu tarafındaki çalışma zamanını ele alacak: olay döngüsünün aşamaları, dosya sistemi ve ağ arayüzleri, akışlar ve geri basınç, süreç yönetimi ve üretim koşullarında günlükleme ile izleme. Bu kursta kurulan tip katmanı orada da geçerlidir — çalışma zamanının sunduğu arayüzler bildirim dosyalarıyla tiplenmiştir ve modül çözümleme kuralları o çalışma zamanının kurallarıdır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.