value satisfies Type, value değerinin Type ile eşleştiğini derleme zamanında kontrol eder ve ardından değerin kendi, daha kesin tipine dokunmaz. Bir notasyon bu kesin tipi Type ile değiştirirdi; satisfies genişletmeden doğrular.
Kontrolü yine satisfies yapar: eksik bir renk, bleu gibi yanlış yazılmış bir anahtar ya da true gibi bir değer o satırda bir derleme hatasıdır. TypeScript 4.9'dan beri vardır ve her tip notasyonu gibi üretilen JavaScript'ten kaldırılır.
satisfies'ın Çözdüğü Sorun
Bir tip notasyonuyla değişkenin tipi notasyonun ta kendisidir. Derleyici literal'de gördüklerini unutur. Burada aynı palet bunun yerine notasyonla yazılmış ve TypeScript artık green değerinin bir string olduğunu bilmiyor:
Derleyici şunu bildirir:
index.ts(11,27): error TS2339: Property 'toUpperCase' does not exist on type 'Color'.
Property 'toUpperCase' does not exist on type '[number, number, number]'.
TypeScript 4.9 öncesinde seçenekler şunlardı: notasyon yazıp her yerde elle daraltmak (typeof palette.green === "string") ya da notasyonu atlayıp kontrolü kaybetmek. satisfies ikisini birden verir. : Record<ColorName, Color> ifadesini kapanış parantezinden sonra satisfies Record<ColorName, Color> olarak değiştirin, çalışır.
satisfies, Tip Notasyonu ve as
Aynı ayarlar nesnesi, üç şekilde yazılmış:
as eksik lang özelliğinin geçmesine izin verdi ve asserted.lang tipi string derken çalışma zamanında undefined oldu. Diğer iki satırdan lang özelliğini silin, ikisi de TS2741 ile başarısız olur, Property 'lang' is missing in type ....
Notasyon const x: T = v | Assertion v as T | v satisfies T | |
|---|---|---|---|
| Eksik özellikler | hata | serbest | hata |
| Fazla özellikler (nesne literal'i) | hata | serbest | hata |
| Yanlış özellik tipi | hata | yalnızca tipler örtüşmüyorsa | hata |
Sonrasında x tipi | T | T | v değerinin çıkarılan tipi |
Literal tipler ("dark", 8080) | T tipine genişletilir | T tipine genişletilir | T izin verdiği yerde korunur |
Bir Record<string, ...> anahtarları | herhangi bir string (yazım hataları derlenir) | herhangi bir string | tam olarak yazılan anahtarlar |
| Çalışma zamanı etkisi | yok | yok | yok |
Pratik kural: değişkenin bildirilen tipe sahip olmasını istediğinizde (yeniden atayacağınız bir değer, public bir API) notasyon yazın; bir kontrol istediğiniz ama değerin kendi tipinin daha işe yarar olduğu durumlarda satisfies kullanın.
Nesne Literal'lerindeki Hataları Yakalamak
satisfies, fazla özellik kontrolleri dahil tam atanabilirlik kontrolünü çalıştırır, bu yüzden anahtarlardaki yazım hataları hatadır:
type Route = { path: string; method: "GET" | "POST" };
const home = { path: "/", metod: "GET" } satisfies Route;
// error TS2561: Object literal may only specify known properties, but 'metod' does not exist in type 'Route'. Did you mean to write 'method'?
Kontrol ayrıca literal'e, tıpkı bir notasyon gibi, bir bağlamsal tip verir. Bu iki açıdan önemlidir. Hedef tip onları beklediğinde string literal'ler literal tip olarak korunur: { path: "/", method: "GET" } satisfies Route ifadesinde method: "GET" olur, notasyonsuz aynı nesne ise method: string çıkarırdı. Ve callback parametreleri hedef tipten çıkarılır:
Record Anahtarları Bilinir Kalır
Yaygın bir kullanım bir arama tablosudur. Record<string, T> notasyonuyla her string geçerli bir anahtardır ve bir yazım hatası derlenip çalışma zamanında undefined döndürür. satisfies ile değerler yine T tipine karşı kontrol edilir, ama değişkenin tipi tam olarak yazdığınız anahtarları listeler:
keyof typeof endpoints yalnızca anahtarlar hayatta kaldığı için işe yarar. Notasyonla bu düz string olurdu.
Sabit bir anahtar kümesi istemek için bir union üzerinden Record karşılayın: satisfies Record<"dev" | "prod", string> eksik bir prod anahtarını TS2741 ile, bilinmeyen bir staging anahtarını da TS2353 ile bildirir.
as const satisfies
as const ve satisfies birleşir. Önce as const yazın: değeri literal tiplerle derinlemesine readonly yapar, ardından satisfies o kesin değeri kontrol eder.
Her route Route tipine karşı kontrol edilir (method: "PUT" hata olurdu) ve literal tiplerden oluşan tuple kullanılabilir kalır; böylece Path gerçek yolların bir union'ı olur. Hedef olarak readonly Route[] (veya ReadonlyArray<Route>) kullanın, çünkü bir as const dizisi readonly'dir.
Yapılandırma Nesneleri
satisfies operatörünün yerini hak ettiği yer yapılandırmadır: biçim doğru olmalıdır ve başka yerdeki kod kesin değerleri ister.
production girdisini unutun, logLevel adını yanlış yazın ya da logLevel: "verbose" yazın, derleyici tam olarak o satırı gösterir. Aynı kalıp *.config.ts dosyalarına uyar: export default { ... } satisfies SomeConfig dosyanın tamamını kontrol ederken export edilen nesne literal değerlerini korur.
satisfies Ne Zaman Kullanılmamalı
- Değişken yeniden atanacaksa.
let cfg = { port: 3000 } satisfies { port: number | string },cfgdeğişkenine{ port: number }tipini verir; bu yüzden daha sonraki bircfg = { port: "80" }başarısız olur (TS2322). Değiştirmeyi düşündüğünüz değişkenlere notasyon yazın. - Bildirilen tipi bilerek istiyorsanız. Bir fonksiyon dönüş değeri ya da bir API'nin parçası olan export edilmiş bir sabit için notasyonun tipi sözleşmedir ve kesin literal tipin sızması sonraki değişiklikleri kırıcı hale getirebilir.
- Değer bir literal değilse.
satisfiesnesne ve dizi literal'lerinde parlar. Bir değişken veya bir çağrı sonucu üzerinde, bir notasyonun zaten sağladığı düz bir atanabilirlik kontrolüdür.
Sıkça Sorulan Sorular
TypeScript'te satisfies ne yapar?
expression satisfies Type, ifadenin Type tipine atanabilir olduğunu derleme zamanında kontrol eder; eksik özellikleri, fazla özellikleri ve yanlış değer tiplerini bildirir, ardından ifadenin kendi çıkarılan tipini değiştirmeden bırakır. Bir notasyonun güvenliğini ve çıkarımın kesinliğini birlikte alırsınız. JavaScript çıktısından silinir.
satisfies ile bir tip notasyonu arasındaki fark nedir?
İkisi de değeri kontrol eder. Bir notasyon (const x: T = ...) ardından değişkene T tipini verir ve derleyicinin değer hakkında bildiklerini unutur (literal tipler, her özelliğin hangi union üyesi olduğu, hangi anahtarların var olduğu). satisfies T ise çıkarılan tipi korur; böylece x.someKey anahtarının var olduğu bilinir ve bir string tutan string | number özelliği string olarak tiplenir.
TypeScript'te satisfies ile as arasındaki fark nedir?
as bir assertion'dır: tipi geçersiz kılar ve neredeyse hiçbir şeyi kontrol etmez, bu yüzden eksik özellikler fark edilmez. satisfies ise bir kontroldür: değer tiple gerçekten eşleşmelidir ve kendi çıkarılan tipi korunur. İkisi de derlenecekse satisfies daha güvenli seçimdir.
as const satisfies ne anlama gelir?
İkisini birden uygular: as const değeri literal tiplerle derinlemesine readonly yapar, ardından satisfies bu sonucu bir tipe karşı kontrol eder. Önce as const yazın: const routes = [...] as const satisfies readonly Route[];. Değişken sonraki kullanımlar için kesin literal tipleri korur ve yanlış bir girdi yine derleme hatasıdır.
satisfies hangi TypeScript sürümünde eklendi?
Kasım 2022'de yayınlanan TypeScript 4.9'da. Düz, silinebilir bir sözdizimidir; bu yüzden Node'un yerleşik type stripping özelliği altında da çalışır ve güncel her TypeScript sürümü (7 dahil) onu destekler.