Aby stworzyć głęboko readonly typ w TypeScript, można użyć rekursji w połączeniu z wbudowanym typem Readonly
. W tym celu tworzymy własny typ rekurencyjny, który sprawdza, czy dany typ jest obiektem, i jeżeli tak, stosuje Readonly
do wszystkich jego właściwości, łącznie z właściwościami obiektów zagnieżdżonych.
Przykład:
type DeepReadonly<T> = T extends Function ? T : T extends object ? { readonly [K in keyof T]: DeepReadonly<T[K]> } : T; interface User { name: string; details: { age: number; address: string; }; } const user: DeepReadonly<User> = { name: 'John', details: { age: 30, address: '123 Street' } }; user.details.age = 31; // Błąd, 'age' jest readonly user.name = 'Alice'; // Błąd, 'name' jest readonly
Typ DeepReadonly<T>
rekursywnie stosuje readonly
do wszystkich właściwości obiektu, w tym również tych, które są obiektami wewnętrznymi, zapewniając, że cały obiekt jest tylko do odczytu.