TypeScript'te Değişebilir ve Değişmez
Bu makale, TypeScript'teki değişebilir ve değişmez kavramlarını açıklar.
YouTube Video
TypeScript'te Değişebilir ve Değişmez
Değişebilir Nedir?
Değişebilir, bir değerin değiştirilebileceği anlamına gelir. Objeler ve diziler gibi referans tipi veriler, değişebilir veri yapılarının tipik örnekleridir.
Değişebilir Bir Obje Örneği
1type Person = { name: string; age: number };
2
3// Mutable Example: Object
4let person: Person = { name: "Alice", age: 25 };
5person.age = 26;
6console.log(person); // { name: "Alice", age: 26 }
Bu kodda, person
objesinin age
özelliği 25
'ten 26
'ya değiştirilmiştir. Objeler referans ile aktarıldığından, person
değişkeninde saklanan hafıza adresindeki içerikler değiştirilir.
Değişebilir Bir Dizi Örneği
1// Mutable Example: Array
2let numbers: number[] = [1, 2, 3];
3numbers.push(4);
4console.log(numbers); // [1, 2, 3, 4]
Bu kodda, push
yöntemi kullanılarak orijinal diziye yeni bir 4
elemanı eklenir. Bu, orijinal diziyi değiştirir ve bu işlemi değişebilir bir işlem yapar.
Bir Fonksiyonda Örnek
1// Mutable Example: Function
2function append(arr: number[], value: number): void {
3 arr.push(value); // Modify the original array
4 console.log(arr);
5}
6
7let nums: number[] = [1, 2, 3];
8append(nums, 4);
9console.log(nums); // [1, 2, 3, 4]
Bir fonksiyon içinde değişebilir işlemler yapıldığında, orijinal dizi de değişir.
Değişmez Nedir?
Değişmez, bir değerin değiştirilemeyeceği anlamına gelir. Basit türler temel olarak değişmezdir.
Değişmez Bir Basit Tür Örneği
1// Immutable Example: String
2let str: string = "hello";
3str[0] = "H"; // Error: Index assignment is not allowed
4console.log(str); // "hello"
str
stringinin ilk karakterini H
olarak değiştirme girişimi başarısız olur çünkü string'ler değişmezdir.
Bir Fonksiyonda Örnek
1// Immutable Example: Function
2function increment(num: number): number {
3 num++; // This modifies only the local copy of num
4 return num;
5}
6
7let number: number = 10;
8console.log(increment(number)); // 11
9console.log(number); // 10 (original number remains unchanged)
Sayılar değişmez olduğundan, bir fonksiyon içindeki işlemler orijinal değişkeni etkilemez.
Diziler Üzerinde Değişmez İşlemler
Diziler değişebilir, ancak orijinalini değiştirmek yerine yeni bir dizi oluşturarak değişmez işlemler yapılabilir.
1// Create an array of numbers
2let numbers: number[] = [1, 2, 3];
3
4// Immutable Example: Creating a new array
5let newNumbers: number[] = [...numbers, 4];
6
7console.log(numbers); // [1, 2, 3] (original array is unchanged)
8console.log(newNumbers); // [1, 2, 3, 4] (new array with an added element)
Burada, ...
yayılım sözdizimi yeni bir newNumbers
dizisi oluşturmak için kullanılır. Orijinal numbers
dizisi değişmeden kaldığı için bu bir değişmez (immutable) işlemdir.
Değişmez Veri Yapılarının Kullanımının Faydaları
Daha İyi Öngörülebilirlik
Değişmez veri değişmez, bu da beklenmeyen değişiklikleri daha az olası kılar ve hataların oluşma olasılığını azaltır.
Değişmezlik Temelli Kütüphanelerle Uyum
React
ve Redux
gibi kütüphaneler genellikle değişmez veriler temel alınarak tasarlanmıştır, bu da uygun şekilde kullanıldığında durum yönetimini kolaylaştırır.
Object.freeze ile Nesneleri Değişmez Hale Getirme
Object.freeze
, bir nesnenin değiştirilmesini önlemek için kullanılabilir.
1// Create a frozen object (properties cannot be modified)
2const person = Object.freeze({ name: "Alice", age: 25 });
3
4// Attempt to modify a property (ignored in non-strict mode, error in strict mode)
5person.age = 26;
6
7console.log(person); // { name: "Alice", age: 25 }
Ancak, Object.freeze
yalnızca yüzeysel bir dondurma yapar, yani iç içe geçmiş nesnelerin özellikleri değiştirilebilir durumda kalır.
1// Create a frozen object with a nested object
2const user: Readonly<{ profile: { name: string } }> = Object.freeze({
3 profile: { name: "Bob" }
4});
5
6// Attempt to modify a nested property (this works because Object.freeze() is shallow)
7user.profile.name = "Charlie"; // No TypeScript error, but still mutable
8
9console.log(user.profile.name); // "Charlie" (nested object is still mutable)
Tamamen değişmez bir nesne oluşturmak için derin dondurma gereklidir.
1// Function to deeply freeze an object, making all nested objects immutable
2function deepFreeze<T>(obj: T): Readonly<T> {
3 Object.freeze(obj);
4 Object.getOwnPropertyNames(obj).forEach(prop => {
5 const value = (obj as any)[prop];
6 if (typeof value === "object" && value !== null) {
7 deepFreeze(value);
8 }
9 });
10 return obj;
11}
12
13// Create a deeply frozen object
14const user = deepFreeze({
15 profile: { name: "Bob" }
16});
17
18// Attempt to modify a nested property
19// (this will now throw an error in strict mode)
20user.profile.name = "Charlie"; // No TypeScript error, but modification is not allowed at runtime
21
22console.log(user.profile.name); // "Bob" (unchanged due to deep freeze)
Özet
- Değişebilir veri değiştirilebilir ve nesneler ile dizileri içerir.
- Değişmez veri değiştirilemez ve metinler (string) ile sayılar gibi ilkel veri türlerini içerir.
- Yayılım sözdizimi veya
map
gibi yöntemler kullanılarak değişmez veri işlemleri gerçekleştirilebilir. Object.freeze
vedeepFreeze
nesneleri değiştirmeyi önlemek için kullanılabilir.- Değişmez veri kullanmak, daha öngörülebilir ve daha az hata içeren kod yazmaya yardımcı olur.
Değişmez bir tasarım benimsemek kod güvenliğini ve okunabilirliğini artırır, bu yüzden bunu tam anlamıyla kullanın!
Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.