İLETİŞİME GEÇİN
strict bayrağı hangi denetimleri açar, strict'in dışında hangi bayraklar değerlidir ve büyük bir kod tabanında strict moda ekibi durdurmadan nasıl geçilir?

TypeScript'i kullanmak, tip güvenliğine sahip olmak anlamına gelmez. strict kapalıyken derleyici; tipi belirtilmemiş parametreleri sessizce any kabul eder, null ve undefined değerlerini her tipe atanabilir sayar ve üretimde "Cannot read properties of undefined" hatasına dönüşecek birçok durumu görmezden gelir. Bu yazıda strict bayrağının neleri açtığını, onun ötesinde hangi bayrakların değerlendirilmeye değer olduğunu ve mevcut bir kod tabanında strict moda ekibi durdurmadan nasıl geçilebileceğini ele alıyoruz.
tsconfig.json içindeki "strict": true, bir grup denetimi birlikte açan bir kısayoldur. Güncel TypeScript sürümlerinde bu aile şunları içerir:
any olmasını hata sayar.null ve undefined'ı ayrı tipler olarak ele alır. En çok hata yakalayan ve geçişte en çok değişiklik gerektiren bayrak genellikle budur.bind, call ve apply çağrılarının argümanlarını denetler.this kullanımını hata sayar.catch bloğundaki hata değişkenini any yerine unknown yapar.Yeni TypeScript sürümleri bu aileye yeni denetimler ekleyebilir. Bu yüzden TypeScript sürümünü yükseltmek, strict modda yeni hatalar görmenize yol açabilir; yükseltmeleri ayrı PR'larda yapmak bu hataları izole eder.
function musteriAdi(id: string) {
const musteri = musteriler.find((m) => m.id === id);
return musteri.ad.toUpperCase();
// strictNullChecks: 'musteri' is possibly 'undefined'.
}
find eşleşme bulamazsa undefined döner. Strict kapalıyken bu kod derlenir ve hata ancak çalışma anında ortaya çıkar. Strict açıkken derleyici sizi bu durumu ele almaya zorlar: ya erken dönüş yaparsınız ya da bulunamama durumunda ne olacağına karar verirsiniz.
try {
await odemeAl(siparis);
} catch (hata) {
// hata: unknown
const mesaj = hata instanceof Error ? hata.message : String(hata);
logger.error({ mesaj, siparisId: siparis.id });
}
JavaScript'te throw ile her şey fırlatılabilir; bir string, bir nesne, hatta undefined. unknown tipi, hata nesnesini kullanmadan önce gerçekten ne olduğunu kontrol etmeyi zorunlu kılar.
Bazı denetimler strict ailesine dahil değildir ve ayrıca açılmaları gerekir:
undefined ekler. satirlar[0] artık Satir değil, Satir | undefined tipindedir. Gerçek bir hata sınıfını yakalar; karşılığında döngü ve dizi kodunda ek kontroller gerektirir.undefined olması" arasındaki farkı ayırt eder.override anahtar kelimesiyle işaretlenmesini zorunlu kılar.break'i unutulmuş case bloklarını yakalar.const satirlar: string[] = dosya.split("\n");
const baslik = satirlar[0];
// noUncheckedIndexedAccess açıkken: string | undefined
for (const satir of satirlar) {
// for...of içinde satir: string (ek kontrol gerekmez)
}
Bu bayrakların ilk açılışta kod tabanında çok sayıda değişiklik gerektirmesi normaldir. Özellikle noUncheckedIndexedAccess'i, strict'e geçiş tamamlandıktan sonra ayrı bir adım olarak ele almak daha yönetilebilirdir.
Büyük bir kod tabanında strict'i tek seferde açmak, haftalarca süren ve sürekli çakışan bir dal demektir. Kademeli bir plan çok daha sürdürülebilirdir:
tsc --noEmit ile kaç hata çıktığını not edin. Hangi bayrağın ne kadar iş getirdiğini görmek sıralamayı belirler."strict": true yerine önce tek tek bayrakları ekleyin. noImplicitAny ve strictNullChecks en çok değer sağlayan, genellikle de en çok iş çıkaran ikilidir.typescript-strict-plugin) ya da ayrı bir tsconfig ile yeni modüllerin baştan sıkı denetlenmesi sağlanabilir.@ts-ignore yerine @ts-expect-error ve kısa bir açıklama kullanın. Altındaki hata düzeldiğinde bu yorum kendisi hata vereceği için unutulmaz.typescript-eslint'in no-explicit-any ve no-non-null-assertion kuralları, strict'in kapattığı kapıların any ve ! operatörüyle arka kapıdan yeniden açılmasını önler.
Strict mod derleme zamanındaki tutarlılığı garanti eder; dışarıdan gelen verinin gerçekten beklenen biçimde olduğunu garanti etmez. API yanıtları, form girdileri, JSON.parse sonuçları ve ortam değişkenleri çalışma zamanında beklenmedik biçimde gelebilir. Bu sınırlarda Zod veya Valibot gibi bir şema kütüphanesiyle doğrulama yapmak, tiplerin gerçekle örtüşmesini sağlar:
import { z } from "zod";
const Siparis = z.object({
id: z.string(),
tutar: z.number().nonnegative(),
teslimTarihi: z.string().nullable(),
});
type Siparis = z.infer<typeof Siparis>;
const siparis = Siparis.parse(await yanit.json());
Aynı ilke otomatik üretilen tipler için de geçerlidir. OpenAPI, GraphQL ya da ORM şemalarından üretilen tipler, ancak dayandıkları şema kadar doğrudur. Strict mod bu tiplerdeki null olabilen alanları görünür kıldığı için genellikle faydalıdır; şema ile gerçek davranış arasında fark varsa bu fark da ilk kez görünür hâle gelir.
Strict mod, hataları kullanıcının ekranından derleyicinin çıktısına taşır. Geçişin maliyeti gerçektir; ama kademeli bir planla, CI'da sabitlenen bir hata sayısıyla ve yeni kodun baştan sıkı yazılmasıyla bu maliyet ekibi durdurmadan, küçük parçalar hâlinde ödenebilir. Ön yüzü ve arka yüzü aynı dilde yazılan TeksERP gibi projelerde bunun ek bir getirisi de var: Sunucu ile istemci arasında paylaşılan tipler, iki tarafın aynı veri sözleşmesine uymasını derleme anında denetler.
Yorumlar yakında etkinleştirilecek.

Dijitalleşme yolundaki KOBİ'ler için en kritik karar: hazır paket programla başlamak mı, yoksa işe özel yazılım geliştirmek mi? İki yaklaşımın artılarını ve eksilerini dürüstçe karşılaştırıyoruz.

Küçük PR'lar, 'neden'i anlatan açıklamalar, otomatik kontroller, niyeti belli yorumlar, öngörülebilir yanıt süreleri ve öğrenmeye açık bir ekiple code review'i darboğazdan kazanca çevirin.

E-ticaret sitenizde ziyaretçileri müşteriye dönüştürmek için kullanıcı deneyiminin gücünü doğru kullanın. Dönüşümü artıran 7 temel UX ilkesini örneklerle ele alıyoruz.