Implicit, Explicit ve Erased Types
TypeScript ile üç farklı şekilde tip belirleme yapabiliriz. Bunlar implicit, explicit ve erased tipleridir.
Implicit anlamsal olarak örtülü/gizli olanı ifade ederken explicit özellikleri açıkça, manuel olarak eklenen durumları ifade eder.
Implicit Types
TypeScript ile ekstra bir type ataması yapmadan da değişkenler oluşturabiliyoruz. Bu değişkenlerin typeları atandığı değerlere göre belirlenir. Örneğin aşağıdaki a
değişkeninin type'ı açıkça belirtilmemiş olsa dahi number
, b
değişkeninin ise string
'dir.
let a = 10;
let b = 'hello';
Implicit typing ile compiler bizim için otomatik kontrolleri yapacaktır:
let isTrue= true;
isTrue= 10;
//$ error: Type '10' is not assignable to type 'boolean'
Bu kural array
ve object
değerleri için de geçerlidir:
let typescriptArr = [1,2]
typescriptArr = ['X','Y']
//$ error: Type 'string' is not assignable to type 'number'.
Explicit Types
Type annotation ile değişkenleri belirli typelarda olmaları konusunda sınırlandırabiliriz. Bu sayede TypeScript kodunuz hakkında daha az çıkarım yapacaktır.
let c: number = 10;
let d: string = 'hello';
TypeScript compiler bölümünda verdiğimiz greet fonksiyonu örneğini ele alalım. Fonksiyonu person
parametresinin bir string
, date
parametresinin ise bir Date
objesi olduğunu söyleyelim.
function greet(person: string, date: Date) {
console.log(`Hello ${person}, today is ${date.toDateString()}!`);
}
greet("Maddison", Date());
// Argument of type 'string' is not assignable to parameter of type 'Date'.
Böylece JavaScript ile Date()
methodunun çağırdığımızda string
dönüyor olduğunu, bunun yerine new Date()
yapısını kullanmamız gerektiğini fark ederek hatayı düzeltmiş olacağız:
function greet(person: string, date: Date) {
console.log(`Hello ${person}, today is ${date.toDateString()}!`);
}
greet("Maddison", new Date());
💡 Her zaman explicit şekilde type annotation yapmak zorunda değiliz. TypeScript'in bunları bir şekilde "fark edebiliyor" olması planlanmış bir feature.
Erased Types
greet
fonksiyonunun tsc
ile alınan JavaScript çıktısına bir bakalım:
"use strict";
function greet(person, date) {
console.log("Hello ".concat(person, ", today is ").concat(date.toDateString(), "!"));
}
greet("Maddison", new Date());
Burada dikkat etmemiz gereken iki şey var:
person
vedate
parametrelerinin type annotationları artık yok.template string
ile yazdığımız string değeri concat metotlarına dönüştürülmüş.
Burada dikkat etmemiz gereken nokta ilk madde. Aslında JavaScript içerisinde type annotation diye bir şey yok. Bu yüzden herhangi bir tarayıcı TypeScript kodunu alıp çalıştıramıyor. TypeScript comppiler'a da bu sebeple ihtiyacımız olduğundan bahsetmiştik. Yazdığımız TypeScript kodlarının silinmesinin sebebi de bu.