Anasayfa » 3. TypeScript’de Özel Tip Tanımı

3. TypeScript’de Özel Tip Tanımı

by Levent KARAGÖL
7 dakikalık okuma süresi

Bu makalemizde, TypeScript’de birden fazla temel tipi birleştirerek kendi özel tiplerimizi nasıl tanımlayacağımızı, bu tiplerin içeriğindeki alt tiplerde opsiyonel ve salt okunur gibi seçenekleri nasıl kullanacağımızı, birden fazla özel tipi birleştirerek genişletilmiş yeni tipleri nasıl elde edeceğimizi inceleyeceğiz.

JavaScript’te yazdığımız fonksiyonlarda geçilen parametre sayısı 3-4 değişkeni geçmediği zamanlarda bunları birer birer geçmekte sıkıntı yaşamayız. Ancak parametre sayısı arttıkça değişkenleri tek tek geçmek, hele ki her bir katman geçişinde bu parametreleri tekrar tekrar yazmak zorunda kalıyorsak oldukça zahmetli bir hale gelir. Böyle durumlarda her bir parametreyi tek tek geçmek yerine, tüm parametreleri içeren nesneleri kullanmaya ve fonksiyonlar arasında bu nesneleri geçmeye başlarız.

TypeScript’in en temel kullanım amacı, tip kontrolü ile hatalı veya eksik veri geçişinin engellenmesi olarak düşünüldüğünde, bağımsız parametreler yerine tek bir nesne geçmek, şimdiye kadar gördüğümüz tip denetimleri ile ters düşüyor gibi gözükebilir. Neyse ki TypeScript’de, birden fazla değişkeni içeren nesneler için de kendi özel tip tanımlamamızı yaparak, geçilen nesnelerin bu tip tanımına uymasını garanti altına alabiliriz.


Tip Tanımı

TypeScript’de tip tanımlaması için “type” ifadesi kullanılır. Aşağıda temel seviyede bir özel tip tanımı örneği bulunmaktadır.

type myCustomType = {
    value1: number;
    value2: string;
};

// Aşağıdaki örnekte, tüm değerler geçerli şekilde atanmıştır
let myCustomObject1: myCustomType = {
    value1: 7,
    value2: "Metinsel ifade"
};

// Aşağıdaki örnekte atanan değerler tip tanımına uygun olmadığı için derleme sırasında hataya sebep olur
let myCustomObject2: myCustomType = {
    value1: "Metinsel ifade",
    value2: false
};

// Aşağıdaki örnekte tip tanımında var olan value2 değeri atanmadığı için derleme sırasında hataya sebep olur
let myCustomObject3: myCustomType = {
    value1: 8
};

// Aşağıdaki örnekte tip tanımında var olmayan value3 değeri atanmaya çalışıldığı için derleme sırasında hataya sebep olur
let myCustomObject4: myCustomType = {
    value1: 7,
    value2: "Metinsel ifade",
    value3: true // Hata: value3 tanımlanmamış bir özelliktir
};


Yukarıdaki örneğin başında, “value1” ve “value2” isminde iki parametre içeren “myCustomType” isminde özel bir tip tanımlaması yaptık. Ardından dört kez bu tip tanımını kullanarak nesne oluşturmaya çalıştık.

Örnekteki yorum metinlerini buraya tekrar yazmayacağım ama özet olarak, özel tip tanımında var olan tüm tiplerin eksiksiz ve uygun şekilde atanmadığı taktirde derleme sırasında hataya sebep olduğunu görüyoruz. Yani sadece uyumsuz tip ataması değil, aynı zamanda olması gereken bir tip atanmadığı veya tanımlanmayan bir tipin atandığı durumda da hataya sebep olduğu açıkça görülüyor.

Benzer şekilde iç içe geçmiş nesnelerden oluşan daha karmaşık tipler de tanımlayabiliriz. Aşağıda bunu örneklemeye çalıştım.

type myCustomType = {
    value1: number;
    value2: string;
    value3: {
        value4: boolean;
        value5: Date;
        value6: {
            value7: number;
            value8: any;
        }
    }
};

// Aşağıdaki örnekte, tüm değerler geçerli şekilde atanmıştır
let myCustomObject1: myCustomType = {
    value1: 7,
    value2: "Metinsel ifade",
    value3: {
        value4: true,
        value5: new Date(),
        value6: {
            value7: 8,
            value8: "Metinsel ifade"
        }
    }
};

// Aşağıdaki örnekte, sadece value8 değeri geçilmediği için derleme sırasında hataya sebep olur
let myCustomObject2: myCustomType = {
    value1: 7,
    value2: "Metinsel ifade",
    value3: {
        value4: true,
        value5: new Date(),
        value6: {
            value7: 8
        }
    }
};

Örnekte görüldüğü üzere, alt nesnelerin sadece birinde atlanan bir değişkende dahi derleme sırasında hataya sebep olur ve konu hakkında bilgimizin olmasına imkân sağlanır.


Opsiyonel Tipler

Yukarıdaki örneklerde, özel tiplerin tanımlarındaki tüm alt tiplerin eksiksiz atanması gerektiğini gördük. Ancak bazı alt tiplerin kullanımının opsiyonel olmasını, sadece ihtiyaç duyulduğu durumlarda kullanılmasını isteyebiliriz. Böyle durumlarda opsiyonel tip tanımlaması için, değişken ismini takip eden “?” ifadesi ile bu değişkenin opsiyonel olduğunu ve atanmaması durumunda hata oluşmaması gerektiğini belirtebiliriz.

type myCustomType = {
    value1: number;
    value2?: string;
    value3: {
        value4: boolean;
        value5?: Date;
        value6?: {
            value7: number;
            value8: any;
        }
    }
};

// Aşağıdaki örnekte, opsiyonel olmayan tüm değerler geçilmiştir, tanımlama geçerlidir
let myCustomObject1: myCustomType = {
    value1: 7,
    value3: {
        value4: true
    }
};

Yukarıdaki örnekte “value2“, “value5” ve “value6” tipleri “?” vasıtasıyla opsiyonel olarak tanımlanmıştır ve hemen altındaki nesne tanımlamasında bu tiplere atama yapılmamasına rağmen hataya sebep olmaz.


Salt-Okunur Tipler

Tip tanımlamalarındaki diğer bir konu, değeri değiştirilemez tip tanımıdır. Bu tanımlama şeklinde, ilk tanımlama sırasında bir değer atanmasına izin verilip, sonrasında bu değerin değişmesine izin verilmez. TypeScript’de salt okunur tip tanımlaması için değişken isminden önce “readonly” ifadesi kullanılır.

type myCustomType = {
    value1: number;
    readonly value2: string;
};

// Nesne tanımlama sırasında her iki tipe de ilk değer atamaları yapılır
let myCustomObject1: myCustomType = {
    value1: 7,
    value2: "test1"
};

myCustomObject1.value1 = 8; // Değer değiştirilebilir
myCustomObject1.value2 = "test2"; // Hata: readonly değer değiştirilemez

Yukarıdaki örnekte ilk tanımlama sonrasında “value2” değişkeninin değerini değiştirmeye çalışmak, derleme sırasında hataya sebep olur.


Birleşik Tipler

TypeScript’de “&” operatörü vasıtasıyla birden fazla tip tanımını birleştirerek daha geniş tip tanımlarının elde edilmesi mümkündür. Daha rahat anlaşılması için bu işlemi bir örnek üzerinde görelim.

type myCustomType1 = {
    value1: number;
    value2: string;
};

type myCustomType2 = {
    value3: boolean;
    value4: Date;
};

// İki tipin birleşiminden oluşan yeni bir tip tanımlanır
type myCustomType = myCustomType1 & myCustomType2;

let myCustomObject: myCustomType = {
    value1: 7,
    value2: "Metinsel ifade",
    value3: true,
    value4: new Date()
};

Yukarıdaki örnekte, iki farklı özel tip tanımı birleştirilerek “myCustomType” adında yeni bir tip tanımı oluşturulmuştur. Bu yeni tip tanımı, her iki tipteki tüm kuralların birleşiminden oluşur ve iki tipten birine uymayan bir atama, derleme sırasında hataya sebep olur.

Böylece TypeScript ile özel tip tanımı konusunun sonuna geldik. Bir sonraki makalemizde TypeScript’de dizi tanımlama yöntemleri ve kullanım şekilleri konusuna değineceğiz.

Herkese iyi çalışmalar…

İLGİNİZİ ÇEKEBİLİR

Bir Yorum Yaz