Menu

TypeScript as: Type Assertion ve Tip Dönüşümü (Cast)

as anahtar kelimesi TypeScript'e bir değeri farklı bir tip olarak ele almasını söyler. Bir cast değildir: çalışma zamanında hiçbir şey dönüştürülmez veya kontrol edilmez. as ve açılı parantez sözdizimini, derleyicinin neye izin verdiğini, unknown üzerinden çift assertion'ları ve bir type guard'ın ne zaman daha iyi bir araç olduğunu öğrenin.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

value as Type bir type assertion'dır: TypeScript'e value değerini Type olarak ele almasını söyler. İnsanlar buna cast der, ama yalnızca derleyiciye verilen bir talimattır. JavaScript çıktısından silinir, çalışma zamanında hiçbir şeyi dönüştürmez ve hiçbir şeyi kontrol etmez.

Tipik kullanım budur: bir değer hakkında derleyicinin bilebileceğinden fazlasını biliyorsunuz (burada bir JSON'un biçimi) ve bunu söylüyorsunuz. Yanılıyorsanız hiçbir şey sizi uyarmaz. Sonraki bölümler bunun ne anlama geldiğini ve bir çalışma zamanı kontrolünün ne zaman daha iyi bir seçim olduğunu gösteriyor.

as ve Açılı Parantez Sözdizimi

Aynı assertion'ın iki yazılışı vardır:

const someValue: unknown = "hello";
const a = someValue as string;   // as syntax
const b = <string>someValue;     // angle-bracket syntax, same meaning

Açılı parantez biçimine, <string> ifadesinin bir JSX etiketi olarak okunacağı .tsx dosyalarında izin verilmez. Her yerde as kullanın, bu soru hiç gündeme gelmez. Assertion'lar gevşek bağlanır, bu yüzden ifadeye devam edecekseniz onları paranteze alın: (value as string).length.

Assertion'lar Değerleri Dönüştürmez

Gerçek hatalara yol açan kısım budur. Bir assertion, derleyicinin bir değer hakkında neye inandığını değiştirir, değerin kendisini değil:

Derleyici asserted değerinin bir number olduğuna inanır, bu yüzden asserted + 1 aritmetik olarak tip kontrolünden geçer. Çalışma zamanında hâlâ "42" string'idir ve JavaScript birleştirme yapar. Bir değerin tipini değiştirmek için onu dönüştürün: Number(x), String(x), Boolean(x), BigInt(x), new Date(x). Dönüşüm fonksiyonlarını string to number sayfası karşılaştırıyor.

İstediğinizYazınÇalışma zamanı etkisi
Bildiğiniz bir tipi derleyiciye söylemekx as Tyok
Bir string'i sayıya çevirmekNumber(x), parseInt(x, 10)dönüştürür
Her şeyi string'e çevirmekString(x), `${x}`dönüştürür
Önce tipi kontrol etmekbir type guard, typeof, instanceofkontrol eder

Derleyicinin İzin Verdikleri

as sınırsız değildir. TypeScript, tiplerden biri diğerine atanabildiğinde x as T ifadesine izin verir: genişletme ("a" as string, dog as Animal) ve daraltma (animal as Dog, unknown as User) ikisi de uygundur. Tipler hiç örtüşmediğinde reddeder:

Derleyici index.ts(3,11): error TS2352: Conversion of type 'string' to type 'number' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. bildirir. Mesajın kendisi kaçış kapısını söyler: input as unknown as number. Bu çift assertion derlenir ve çalışma zamanında yukarıdaki örnek kadar yanlıştır. Ona ihtiyaç duyduğunuzda doğru çözüm genellikle bir dönüşüm (Number(input)) ya da farklı bir tiptir.

Örtüşme kuralı nesneler için gevşektir. Özelliklerin bir kısmına sahip bir nesne literal'i kabul edilir; as eksik nesnelerin sessizce geçmesine bu şekilde izin verir:

Bir notasyon (const draft: User = { name: "Ada" }) ya da satisfies User eksik email özelliğini bildirirdi (TS2741). Bir nesne literal'inde as kullanımını yalnızca onu sonradan gerçekten dolduracaksanız yapın; eksiksiz nesneyi oluşturmayı tercih edin.

as const Farklıdır

as const bir assertion gibi görünür ama gevşetmenin tam tersini yapar: bir literal'i olabildiğince dar yapar. String'ler literal tip olarak kalır, diziler readonly tuple'lara dönüşür ve nesne özellikleri readonly olur.

Güvenlidir, çünkü derleyicinin göremediği bir şeyi iddia etmek yerine literal'i tam olarak tanımlar. (isSize içindeki sizes as readonly string[] bir genişletme assertion'ıdır ve o da güvenlidir: includes metodunun her string'i kabul etmesini sağlar.) Daha fazlası için literal tipler sayfasına bakın.

Type Guard Ne Zaman Daha İyi Bir Araçtır

as bir iddiadır; bir type guard ise bir kontroldür. Verinin kodunuzun dışından geldiği bir sınırda (JSON, fetch, localStorage, kullanıcı girdisi, bir mesaj) iddia yanlış olabilir ve bir assertion, sınırdaki açık bir hatayı başka bir yerde kafa karıştırıcı bir hataya dönüştürür.

Birbirine benzeyen araçlar için kaba bir rehber:

AraçDerleme zamanında kontrolÇalışma zamanında kontrolNe zaman kullanılır
Notasyon const x: T = ...evet, tamamenhayırdeğeri kendiniz oluşturuyorsanız
satisfies Tevet, tamamen, çıkarılan tipi korurhayırnesne literal'leri, yapılandırma
as Tyalnızca "tipler örtüşüyor mu"hayırderleyiciden fazlasını biliyorsanız
x!yalnızca null / undefined çıkarırhayırbir değerin ayarlandığını biliyorsanız
Type guard x is Tguard'ın gövdesi sıradan koddurevetdışarıdan gelen veri

as için iki iyi kullanım kalır: derleyicinin izleyemediği bir şeyi daraltmak (iki satır önce ayarladığınız bir Map girdisi, tipsiz bir kütüphaneden gelen bir değer) ve eksik fixture'lar oluşturan test kodu. Onları küçük ve iddianın doğru olduğunu bildiğiniz yere yakın tutun.

Sıkça Sorulan Sorular

TypeScript'te as ne yapar?

value as Type bir type assertion'dır: derleyiciye bundan sonra value değerini Type olarak ele almasını söyler. Derlenmiş JavaScript'ten kaldırılır, bu yüzden hiçbir dönüşüm ve hiçbir çalışma zamanı kontrolü yapmaz. Assertion yanlışsa program daha sonra, yanlış tipin kullanıldığı yerde başarısız olur.

TypeScript'te bir tip nasıl cast edilir?

TypeScript'te çalışma zamanı cast'leri yoktur. Derleyiciden daha fazlasını bildiğinizde statik tipi değiştirmek için as (veya eski <Type>value) kullanın. Bir değeri gerçekten dönüştürmek için bir fonksiyon çağırın: Number("42"), String(42), Boolean(x), new Date(text).

TypeScript'te "as unknown as" ne anlama gelir?

Çift assertion'dır. İki tip hiç örtüşmediğinde TypeScript x as T ifadesini reddeder (TS2352 hatası); önce unknown üzerinden geçmek bu kontrolü atlatır, çünkü unknown tipine ve ondan her şey assert edilebilir. O değer için tip kontrolünü tamamen kapatır; bu yüzden onu testlere ve tipi başka bir yolla doğruladığınız kodlara saklayın.

TypeScript'te as ile açılı parantez arasındaki fark nedir?

Anlamca yok: <string>value ve value as string aynı assertion'dır. Açılı parantez biçimi JSX ile çakıştığı için .tsx dosyalarında kullanılamaz; herkesin kullandığı biçim bu yüzden as olur.

as ile satisfies arasındaki fark nedir?

as çıkarılan tipi geçersiz kılar ve çok az şeyi kontrol eder (eksik özelliklere izin verilir). satisfies ise değeri bir tipe karşı kontrol eder, eksik veya fazla özellikleri bildirir ve kesin çıkarılan tipi korur. Nesne literal'leri için satisfies, yalnızca derleyiciden gerçekten daha fazlasını bildiğinizde as tercih edin.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA