Skip to main content

Type Narrowing

Narrowing adından da anlaşılacağı üzere tiplerin daha açıklayıcı ve kesin olmasını sağlayan bir yöntemdir ve yazılan kodlarda hata yapma olasılığını düşürür. Örneğin string | number gibi bir union type kullanıyorsanız, her iki durumu da kontrol altına alabilmek adına narrowing'e ihtiyaç duyacaksınız demektir.

Bir union tipini tek tipe düşürmek istiyorsak her iki durumu ele almamız gerekir. Bunu da konu JavaScript olunca akıllara gelen ilk seçenekler olan if/else ya da switch statementları ile halledebiliriz.

TypeScript handbook'ta verilen örneğe bir bakalım. padLeft adında bir fonksiyonumuz var:

function padLeft(padding: number | string, input: string): string {
throw new Error("Not implemented yet!");
}

padding bir sayı ise input'un önüne ekleyeceğimiz boşluk sayısını verecek ancak padding bir string değerinde ise doğrudan padding'i input'un önüne ekleyecek. Şimdi padding'e bir sayı vermeyi deneyelim:

function padLeft(padding: number | string, input: string) {
return " ".repeat(padding) + input;

🚨 Argument of type 'string | number' is not assignable to parameter of type 'number'.
Type 'string' is not assignable to type 'number'.
}

TypeScript padding için açıkça bir number değeri kullanacağımızı ona belirtmediğimiz ya da string olma durumunda ne yapacağını söylemediğimiz için bizi uyarıyor.

function padLeft(padding: number | string, input: string) {
if (typeof padding === "number") {
return " ".repeat(padding) + input;
}
return padding + input;
}

Bunun doğrudan JavaScript kodu olduğunu düşünebilirsiniz ancak aslında amaç da tam olarak bu. TypeScript'in amacı sıradan JavaScript kodlarını yazmayı kolaylaştırmak. Üstelik burada göründüğünden de fazlası var. TypeScript statik tipleri kullanarak runtime değerlerini kontrol ettiği gibi tipleri etkileyebilecek if/else, conditional ternaryler, looplar, truthiness kontrolleri gibi JavaScript'in runtime kontrol akışı yapıları üzerinde bir analiz sağlar.

Kullandığımız if kontrolünde TypeScript typeof padding === "number"'ı görür ve bunun type guard adında özel bir tür kod yapısı olduğunu anlar. Programımızın olası tüm çalışma yollarını takip ederek bir değerin belirli bir konumda en spesifik tipini analiz etmeye çalışır. Kısacısı bu özel kontrollere (type guards) bakar ve değerlerin tanımlandıklarından daha spesifik tiplere daraltılmasına da narrowing denir.

Kaynaklar

Narrowing Types - Formidable

Type Narrowing Cheatsheet - Codecademy

Type Guards - TypeScript Handbook

How to use type guards in TypeScript - logrocket.com