Modül dersleri (1/2)
Tip Korumalar
Tür daraltma TypeScript'teki en önemli kavramlardan biridir. Ancak çoğu zaman typeof veya instanceof gibi standart tip korumalar karmaşık özel nesneler için yeterli değildir. Özel Tip Korumaların devreye girdiği yer burasıdır.
Standart Tip Korumalar
TypeScript'in standart JavaScript operatörlerini kullanarak türleri nasıl daralttığını özetleyerek başlayalım:
function processInput(val: string | number) {
if (typeof val === 'string') {
// Here 'val' is of type string
console.log(val.toUpperCase());
} else {
// Here 'val' is of type number
console.log(val.toFixed(2));
}
}Özel Tür Korumalar (is operatörü)
Özel bir tür koruması tanımlamak için, standart bir boole dönüş türü yerine parameterName is Type biçiminde bir tür yüklemi döndüren bir işlev yaratırız.
İşlev bir boole değeri döndürmelidir (true veya false). true değerini döndürürse TypeScript, iletilen parametrenin belirtilen türde olduğunu bilecektir.
interface Cat {
name: string;
meow(): void;
}
interface Dog {
name: string;
bark(): void;
}
// This is a custom type guard
function isCat(animal: Cat | Dog): animal is Cat {
return (animal as Cat).meow !== undefined;
}
function makeNoise(pet: Cat | Dog) {
if (isCat(pet)) {
// Here TypeScript knows 'pet' is a Cat
pet.meow();
} else {
// Here TypeScript knows 'pet' is a Dog
pet.bark();
}
}Güvenlik ve Döküm (as vs Tip Korumalar)
Tür dönüşümü (örneğin, val as Cat), derleyiciyi herhangi bir gerçek çalışma zamanı doğrulaması olmadan geliştiriciye güvenmeye zorlar. Çalışma zamanı nesnesi beklentileri karşılamıyorsa kod sessizce başarısız olur veya istisnalar atar.
Öte yandan özel tür korumaları, TypeScript derleyicisine gerçek değişken türü hakkında güvenli ve doğru bir şekilde bilgi vererek sağlam ve dinamik bir çalışma zamanı kontrolü gerçekleştirir:
function processInput(input: unknown) {
// unsafe casting: could crash if input does not have the split method
// const str = input as string;
// console.log(str.split(' '));
// safe guard
if (isString(input)) {
console.log(input.split(' ')); // 100% Safe!
}
}Kendin dene
Alıştırma 1: String Tipi Koruma
Bilinmeyen bir değerin dize olup olmadığını doğrulamak için özel tür koruması görevi gören isString adında basit bir işlev oluşturun.
İpucu göster
Fonksiyonun dönüş tipi val olmalıdır string ve 'string'e eşit olup olmadığını kontrol etmek için typeof kullanmalısınız.
3 denemeden sonra çözüm mevcut
Alıştırma 2: Premium Kullanıcı Türü Koruması
Kullanıcı ve PremiumUser türleri göz önüne alındığında, isPremiumUser(user: User) türünde bir koruma işlevi yazın: kullanıcı, kullanıcının 'premium' rolüne sahip olup olmadığını kontrol eden PremiumUser'dır.
İpucu göster
İmzayı fonksiyon isPremiumUser(user: User) olarak tanımlayın: kullanıcı PremiumUser'dır ve user.role'u 'premium' ile karşılaştırın.
3 denemeden sonra çözüm mevcut
Alıştırma 3: Özel Hata Nesnesi Doğrulaması
isCustomError(err: bilinmiyor): err işlevini uygulayın, bilinmeyen bir değerin 'code' anahtarını içeren boş olmayan bir CustomError nesnesi olup olmadığını doğrulayan CustomError işlevidir.
İpucu göster
Öncelikle typeof err'nin 'object' olup olmadığını ve boş olmadığını kontrol edin, ardından 'code' özelliğini kontrol etmek için 'in' operatörünü kullanın.
3 denemeden sonra çözüm mevcut
Alıştırma 4: Yönetici Türü Koruması
User (özellik rolüyle: string) ve Admin (User'i genişleten ve adminToken: string özelliğine sahip) iki arayüz verildiğinde, User tipinde bir kullanıcıyı kabul eden ve Admin olan kullanıcı tipini döndüren isAdmin adında bir tip koruma fonksiyonu yazın. Koruma, kullanıcının rolünün 'yönetici'ye eşit olup olmadığını kontrol etmelidir.
İpucu göster
İmzayı function isAdmin(user: User): user is Admin olarak tanımlayın ve user.role === 'admin' olup olmadığını kontrol edin.
3 denemeden sonra çözüm mevcut