Literal Types, bir değişkenin mümkün olan değerlerini yalnızca belirli katı sabitlerle kısıtlamaya olanak tanır, genel bir tür yerine (örneğin, yalnızca bir sayı değil, sayı 5 veya "evet" metni gibi).
Bu, sabit parametreleri, durumları vb. olan API'ler oluşturmak için yararlıdır.
type Direction = 'left' | 'right' | 'up' | 'down'; function move(dir: Direction) { // ... } move('left'); // TAMAM move('top'); // Derleme hatası!
Sayılarda, boolean değerler ve hatta tam yapılar (tuple literal type) ile de çalışır:
type WeekDay = 1 | 2 | 3 | 4 | 5 | 6 | 7; const day: WeekDay = 6; // TAMAM
const d = 'left'; // 'left' (Literal) tipine sahiptir let e = 'left'; // string (normal) tipine sahiptir
Soru: const x = "yes"; olarak tanımlarsak değişken hangi tipe sahip olur ve başka bir metin değeri atayabilir miyiz?
Cevap:
const x = "yes"; olarak tanımlanırsa, x 'yes' (literal type) tipine sahip olacak ve ona başka bir değer atamak mümkün olmayacaktır (ve zaten değiştirilemez çünkü const).let x = "yes"; olarak tanımlarsak, x string olarak tiplenir ve her türlü metin atanabilir.const x = 'yes'; // x: 'yes' let y = 'yes'; // y: string
Hikaye
Bir görev durumları projesinde enum kullanılıyordu, ancak geliştirici bunu string ile değiştirdi. Sonuç olarak API, durum olarak herhangi bir string kabul etmeye başladı ve bu da ürün geliştirilirken birçok hataya yol açtı çünkü kontrol kayboldu.
Hikaye
Geliştirici literal tipleri veri doğrulaması için kullanmaya çalıştı, ancak form alanından parametreleri doğrudan atadı - TS bunu yapmasına izin verdi çünkü input tipi string idi, literal değil (örneğin "ok" | "fail"), çünkü input değerleri kontrol edilmedi. Sonuçta, çalışma zamanında geçerli değer kümesinin dışında değerler ortaya çıktı.
Hikaye
Literal değerler alan bir fonksiyon için test yazarken, otomatik olarak üretilen bir test beklenmeyen bir string parametre gönderdiği için testler geçmedi. Daha sonra, tiplerin let ile tanımlanmasındaki dikkat eksikliği nedeniyle sınıflandırmanın zayıfladığı anlaşıldı ve bu durum derleyici tarafından yakalanmadı.