Template literal tip, bir JavaScript template string'iyle aynı backtick sözdizimiyle string literal tipler oluşturur. `on${Capitalize<"click" | "focus">}`, derleyicinin hesapladığı "onClick" | "onFocus" tipidir:
Template literal tipler yalnızca derleme zamanında vardır. Siz kod yazarken string literal'leri ve tipli değerleri kontrol ederler; JavaScript çıktısına hiçbir şey eklemezler. Yukarıdaki handler tablosu, her ad için bir fonksiyonu zorunlu kılmak için Record kullanıyor.
Sözdizimi
Backtick'lerin içine literal metin ve ${...} yer tutucuları yazarsınız. Bir yer tutucu bir değer değil bir tip tutar: bir string, number, bigint ya da boolean literal tipi, bunların bir union'ı ya da string, number, bigint, boolean, null ve undefined geniş tiplerinden biri.
string veya number gibi geniş bir tipe sahip bir yer tutucu bir kalıp oluşturur: tip `hello ${string}` olarak kalır ve uyan her string kabul edilir. boolean gibi sonlu bir union'a sahip bir yer tutucu ise üyelerine açılır.
Union'lar Çoğalır
Birden fazla union olduğunda sonuç her kombinasyondur:
Üç boyut çarpı iki ton altı üye eder. Sayı hızla büyür: her biri on harflik bir union tutan beş yer tutucu 100.000 üye ederdi ve TypeScript error TS2590: Expression produces a union type that is too complex to represent ile reddeder. Her kesin değere ihtiyacınız yoksa ${string} gibi geniş bir yer tutucu kullanın.
Uppercase, Lowercase, Capitalize, Uncapitalize
Dört yerleşik tip, string literal tiplerin büyük küçük harf durumunu değiştirir. Bunlar intrinsic'tir: TypeScript ile yazılmamış, derleyicinin içinde implement edilmiştir.
| Tip | Girdi | Sonuç |
|---|---|---|
Uppercase<S> | "hello world" | "HELLO WORLD" |
Lowercase<S> | "Content-Type" | "content-type" |
Capitalize<S> | "hello world" | "Hello world" |
Uncapitalize<S> | "UserName" | "userName" |
Yalnızca tipleri değiştirirler. Eşleşen çalışma zamanı string'ini oluşturmak için yine toUpperCase() çağırır ya da kendiniz bölüp büyük harfe çevirirsiniz ve TypeScript'e sonucun kesin tipte olduğunu söylersiniz:
as gereklidir, çünkü toUpperCase() düz string döndürecek şekilde tiplenmiştir. Çağıranların gördüğü şey fonksiyonun imzasıdır, bu yüzden capitalize("report") literal "Report" tipine sahiptir.
String Kalıpları: ${number}px ve Benzerleri
Bir kalıp tipi, belirli bir biçimdeki her string'i kabul eder. CSS değerleri, id'ler ve bilinen bir öneke sahip anahtarlar için kullanışlıdır:
${number}, JavaScript'in sayı olarak okuduğu her string'i kabul eder ve bu göründüğünden daha gevşektir: "-3px", "1e3px" ve "0x10px" hepsi tip kontrolünden geçer. Bu kalıpları tam bir doğrulama olarak değil, literal'lerdeki yazım hatalarına karşı bir koruma olarak görün.
Mapped Type'larla Template Literal'ler
Template literal tipler en çok bir mapped type'ın as ifadesi olarak işe yarar; orada başka özellik adlarından yeni özellik adları üretirler:
Capitalize sayı ya da symbol kabul etmediği için string & K yalnızca string anahtarları tutar. Her callback parametre tipini izlediği özellikten alır.
infer ile String Ayrıştırmak
Bir koşullu tipte, bir template literal bir string ile eşleşebilir ve onun parçalarını infer ile yakalayabilir. Bu, bir route kalıbından parametre adlarını çıkarır:
Çağrıda postId değerini atlarsanız derleyici onu eksik olarak bildirir.
Template İfadeleri string'e Genişler
Sıradan koddaki bir template string ifadesi, her parçası literal tip olsa bile string olarak tiplenir. Template literal tipini korumak için as const ekleyin:
as const olmadan loose değerini `log:${Level}` tipine atamak başarısız olur, çünkü string herhangi bir şey olabilir.
Sıkça Sorulan Sorular
TypeScript'te template literal tipler nedir?
Backtick ve ${...} yer tutucularla yazılan string literal tiplerdir; JavaScript template string'leri gibidir ama tip düzeyinde çalışır. type Greeting = `hello ${string}` ile hello ile başlayan her string kabul edilir, `on${Capitalize<"click">}` ise "onClick" literal tipidir.
Bir template literal tipe union koyduğunuzda ne olur?
Template her üye için açılır; birden fazla union varsa her kombinasyonu elde edersiniz. `${"sm" | "lg"}-${"red" | "blue"}`, "sm-red" | "sm-blue" | "lg-red" | "lg-blue" olur. Çok büyük kombinasyonlar TS2590 hatasıyla başarısız olur.
Uppercase, Lowercase, Capitalize ve Uncapitalize ne yapar?
String literal tipleri dönüştüren yerleşik tiplerdir: Uppercase<"id">, "ID"; Lowercase<"ID">, "id"; Capitalize<"name">, "Name"; Uncapitalize<"Name"> ise "name" olur. Yalnızca tipleri değiştirirler; çalışma zamanındaki bir string'i değiştirmek için yine toUpperCase() ve benzerlerini çağırırsınız.
Template literal tipler string'leri çalışma zamanında doğrular mı?
Hayır. Her TypeScript tipi gibi silinirler, bu yüzden yalnızca derleme zamanında string literal'leri ve tipli değerleri kontrol ederler. Çalışma zamanında JSON'dan ya da kullanıcı girdisinden gelen bir string, siz kendi kodunuzla kontrol edene kadar yalnızca string tipindedir.
Template string'im neden literal tip yerine string olarak tipleniyor?
`on${event}` gibi bir template ifadesi bir değişkene atandığında string olarak genişletilir. as const ekleyin (`on${event}` as const) ya da hedef tipi notasyonla belirtin; TypeScript template literal tipini korur, örneğin "onclick" | "onfocus".