değişmezlik - Immutable Map'i Typescript kullanarak doğru bir şekilde nasıl kesin türde dönüştürürsünüz
Aşağıdakini js'den Typescript'e nasıl dönüştürebilirim:
Immutable.Map({
item1: null,
item2: "hello",
item3: Immutable.Map({
item4: 2,
item5: true
})
});
Cevap #1
immutable.js framework ile aşina değilim, ama standart bir JavaScript map kullanmayı öneririm. Typescript'in ReadonlyMap tipi var, bu temel olarak map nesnesindeki tüm setter'ları kaldırır. Nesnenin kendisi gerçekten değiştirilemez olmayacak (yani çalışma zamanı hatası oluşmaz), ama typescript derleyicisi değer eklemeye/çıkarmaya/güncellemeye çalışırsanız uyarı verecektir.
const myMap: ReadonlyMap<string, string> = new Map([
['item1', 'foo'],
['item2', 'bar']
]);
console.log(myMap.get('item1')); // will log foo
myMap.set('item1', 'foobar'); // Property set does not exist on type readonly map
Birkaç konu dışı ama bence harita yapınızı tekrar gözden geçirmeyi önerebilirim. Tabii ki string | null sorun değil. Ama string | null | ReadonlyMap<string, number | boolean> bana tuhaf bir harita gibi geliyor.
Ayrıca, okumak isterseniz işte harita belgeleri.
Cevap #2
Şu şekilde bir şey yapabilirsin:
type Immutable<T> = {
readonly [K in keyof T]: Immutable<T[K]>;
};
// Then you could write your interface
interface Person {
name: string;
lastName: string;
address: {
street: string;
zipCode: number;
}
}
const person: Immutable<Person> = {
name: 'joe',
lastName: 'smith',
address: {
street: 'smith street',
zipCode: 55555
}
}
// Then when you try to mutate, typescript should throw an error that it is a readonly property
person.name = 'alice';
person.address.street = 'ano'
Kredi, buraya bağlantısı verilen bu makalenin yazarına aittir: https://www.sitepoint.com/compile-time-immutability-in-typescript/
