0Pricing
TypeScript Academy · Lekcja

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, always

Przykł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 history

Przezroczystość 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); // true

Dlaczego 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 31

Niemutowalne 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])); // 6

Przenoszenie 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

  1. Czyste funkcje i niezmienność
  2. Currying i częściowa aplikacja
  3. Kompozycja funkcji z typami
  4. Typowane narzędzia pipe i flow
← Powrót do TypeScript Academy