Czyste funkcje i niezmienność
Pisz przewidywalne funkcje bez efektów ubocznych
Czyste funkcje i niezmienność to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej TypeScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
Czym jest funkcja czysta?
Funkcja czysta zwraca ten sam wynik dla tych samych danych wejściowych i nie powoduje żadnych skutków ubocznych. Nie odczytuje ani nie zapisuje zewnętrznego stanu, nie modyfikuje argumentów i nie wykonuje operacji wejścia-wyjścia.
Przykład funkcji czystej
Ta funkcja zależy wyłącznie od swoich argumentów i zwraca tylko wynik. Jej wywołanie nigdy nie zmienia niczego poza nią.
function add(a: number, b: number): number {
return a + b;
}
console.log(add(2, 3)); // 5, alwaysPrzykład funkcji nieczystej
Ta funkcja odczytuje i modyfikuje zmienną znajdującą się poza jej zakresem, więc jej wynik zależy od ukrytego stanu, a sama pozostawia po sobie ślad. To sprawia, że jest nieczysta.
let counter = 0;
function next(): number {
counter += 1; // side effect
return counter;
}
console.log(next(), next()); // 1 2, depends on historyPrzezroczystość referencyjna
Czyste wywołanie jest referencyjnie przezroczyste: można zastąpić wywołanie jego wynikiem bez zmiany działania programu. add(2, 3) można wszędzie zastąpić przez 5.
const x = add(2, 3) * 2;
const y = 5 * 2; // identical meaning
console.log(x === y); // trueDlaczego czystość pomaga
Czyste funkcje łatwo testować (nie wymagają przygotowania środowiska), łatwo buforować, można bezpiecznie uruchamiać równolegle i łatwo analizować, ponieważ nie mają ukrytych zależności.
Unikanie modyfikowania argumentów
Modyfikowanie wejściowej tablicy lub obiektu jest skutkiem ubocznym, którego osoba wywołująca może się nie spodziewać. Zamiast tego należy utworzyć i zwrócić nową wartość.
// Impure: mutates input
function pushImpure(xs: number[], v: number) { xs.push(v); return xs; }
// Pure: returns a new array
function pushPure(xs: number[], v: number): number[] { return [...xs, v]; }Niemutowalne aktualizacje za pomocą spread
Operator spread kopiuje obiekt lub tablicę, umożliwiając nadpisywanie pól bez dotykania oryginału. W TS jest podstawowym narzędziem do wykonywania niemutowalnych aktualizacji.
interface User { name: string; age: number }
function birthday(u: User): User {
return { ...u, age: u.age + 1 };
}
const before = { name: "Ada", age: 30 };
const after = birthday(before);
console.log(before.age, after.age); // 30 31Niemutowalne aktualizowanie tablic
Należy używać map, filter i spread do tworzenia nowych tablic zamiast je modyfikować. Oryginalna tablica pozostaje niezmieniona, więc inny kod może nadal na niej polegać.
const nums = [1, 2, 3];
const doubled = nums.map(n => n * 2);
console.log(nums, doubled); // [1,2,3] [2,4,6]readonly dla bezpieczeństwa
Oznaczenie parametrów jako readonly informuje kompilator (i osoby czytające kod), że funkcja nie będzie ich modyfikować, wzmacniając czystość na poziomie typów.
function sum(xs: readonly number[]): number {
return xs.reduce((a, b) => a + b, 0);
}
console.log(sum([1, 2, 3])); // 6Przenoszenie efektów na obrzeża
Rzeczywiste programy potrzebują efektów (logowania, sieci). Styl funkcyjny utrzymuje rdzeń w stanie czystym i izoluje efekty na granicach, dzięki czemu większość kodu pozostaje przewidywalna.
Lista kontrolna
W przypadku każdej funkcji należy zapytać: czy zależy wyłącznie od danych wejściowych? Czy zwraca tylko wartość? Czy pozostawia dane wejściowe i świat zewnętrzny bez zmian? Trzy odpowiedzi „tak” oznaczają, że funkcja jest czysta.
Szybkie sprawdzenie
Szybkie sprawdzenie wiadomości z tej lekcji.
Podsumowanie
Czyste funkcje zależą wyłącznie od danych wejściowych i nie powodują skutków ubocznych, zapewniając przezroczystość referencyjną. Do niemutowalnych aktualizacji należy używać spread, map/filter i readonly, a efekty świata rzeczywistego przenosić na obrzeża programu.
Często zadawane pytania
Czy lekcja „Czyste funkcje i niezmienność” jest bezpłatna?
Tak — pełny tekst „Czyste funkcje i niezmienność” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu TypeScript Academy, przejdź na CoddyKit PRO. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Czyste funkcje i niezmienność”?
Pisz przewidywalne funkcje bez efektów ubocznych Ćwiczysz TypeScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć TypeScript Academy?
Nie wymagamy żadnego doświadczenia. TypeScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Czyste funkcje i niezmienność”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji TypeScript Academy?
Tak. Każda lekcja TypeScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Czyste funkcje i niezmienność
- Currying i częściowa aplikacja
- Kompozycja funkcji z typami
- Typowane narzędzia pipe i flow