ProgramlamaTypeScript geliştiricisi

TypeScript'te Literal Types nedir ve ne amaçla kullanılır? Bunlar ile değişkenlerin değerlerine nasıl sıkı kısıtlamalar getirilir ve kullanımında hangi tuzaklar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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

Kısıtlamalar ve nüanslar:

  • Literal tiplere değerler başka türlere dönüştürülemez (örneğin, bir 'left' | 'right' türündeki bir değişkene kullanıcı girişi gibi bir metin atanamaz, kontrol edilmeden).
  • Sabitler ve let değişkenleri ile çalışırken tip çıktısını hatırlamak önemlidir:
const d = 'left'; // 'left' (Literal) tipine sahiptir let e = 'left'; // string (normal) tipine sahiptir

Kandırmaca Sorusu

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

Gerçek hatalara dair örnekler.


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ı.