0Pricing
TypeScript Academy · Lekcja

Komponowanie efektów

Łącz i komponuj efekty za pomocą pipe i generatorów

Komponowanie efektów to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 3 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.

Składanie efektów

Efekty są wartościami, dlatego programy buduje się przez ich składanie. Podstawowe narzędzia to Effect.pipe, Effect.map, Effect.flatMap oraz składnia Effect.gen oparta na generatorach.

pipe: przekazywanie przez funkcje

pipe przekazuje efekt przez serię przekształceń od lewej do prawej, unikając głębokiego zagnieżdżania.

import { Effect, pipe } from "effect";

const program = pipe(
  Effect.succeed(2),
  Effect.map((n) => n + 1),
  Effect.map((n) => n * 10)
);
// Effect<number, never, never> producing 30

map: przekształcanie wyniku

Effect.map stosuje czystą funkcję do wartości wyniku, pozostawiając kanały błędów i wymagań bez zmian.

import { Effect } from "effect";

const doubled = Effect.map(Effect.succeed(21), (n) => n * 2);
// Effect<number, never, never>

flatMap: sekwencyjne wykonywanie efektów

Gdy następny krok sam jest efektem, należy użyć flatMap (nazywanego również chain). Operator uruchamia pierwszy efekt, a następnie przekazuje jego wartość do funkcji zwracającej kolejny efekt.

import { Effect, pipe } from "effect";

const getId = Effect.succeed(1);
const loadUser = (id: number) => Effect.succeed({ id, name: "Ada" });

const program = pipe(getId, Effect.flatMap(loadUser));
// Effect<{ id: number; name: string }, never, never>

map a flatMap

Należy użyć map, gdy funkcja zwraca zwykłą wartość, a flatMap, gdy zwraca efekt. Użycie map z funkcją zwracającą efekt prowadzi do powstania zagnieżdżonego efektu.

Kanały się kumulują

Podczas sekwencyjnego wykonywania efektów ich typy błędów łączą się w sumę typów, podobnie jak typy wymagań. Typ złożonego efektu odzwierciedla wszystko, co może się nie powieść, oraz wszystko, co jest potrzebne.

// Effect<A, E1, R1> then Effect<B, E2, R2>
// => Effect<B, E1 | E2, R1 | R2>

Effect.gen: składnia generatorów

Effect.gen pozwala pisać sekwencyjny kod efektów, który przypomina async/await, używając yield* do rozpakowywania kolejnych efektów.

import { Effect } from "effect";

const program = Effect.gen(function* () {
  const id = yield* Effect.succeed(1);
  const user = yield* Effect.succeed({ id, name: "Ada" });
  return user.name;
});
// Effect<string, never, never>

gen a pipe

gen jest czytelniejszy w przypadku liniowych przepływów składających się z wielu kroków i zmiennych pośrednich; pipe sprawdza się w krótkich łańcuchach przekształceń. Można ich swobodnie używać razem.

Łączenie niezależnych efektów

Effect.all uruchamia wiele efektów i zbiera ich wyniki, kumulując błędy i wymagania ze wszystkich efektów.

import { Effect } from "effect";

const both = Effect.all([Effect.succeed(1), Effect.succeed("x")]);
// Effect<[number, string], never, never>

Nadal leniwe

Wszystkie te operacje jedynie opisują program. Nic się nie wykonuje, dopóki program nie zostanie uruchomiony na brzegu systemu za pomocą Effect.runPromise lub Effect.runSync.

import { Effect } from "effect";
// const result = await Effect.runPromise(program);

Dlaczego to ma znaczenie

To właśnie kompozycja sprawia, że efekty są praktyczne: z małych, typowanych elementów można budować duże programy, a kompilator śledzi każdy błąd i każdą zależność. map, flatMap, pipe i gen to podstawowe czasowniki używane na co dzień w kodzie Effect.

Szybki test

Proszę sprawdzić swoje rozumienie kompozycji efektów.

Podsumowanie

Efekty można komponować za pomocą map (przekształca wartości sukcesu), flatMap (sekwencyjnie wykonuje kroki zwracające efekty), pipe (przekazuje wartość przez kolejne przekształcenia) oraz Effect.gen (składnia generatora przypominająca oczekiwanie na wynik). Kanały błędów i wymagań narastają w postaci unii, a nic nie jest wykonywane, dopóki efekt nie zostanie uruchomiony na brzegu aplikacji.

Często zadawane pytania

Czy lekcja „Komponowanie efektów” jest bezpłatna?

Tak — pełny tekst „Komponowanie efektów” 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 „Komponowanie efektów”?

Łącz i komponuj efekty za pomocą pipe i generatorów Ć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 3 z 4.

Ile czasu zajmuje lekcja „Komponowanie efektów”?

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. Dlaczego systemy efektów mają znaczenie
  2. Typ Effect
  3. Komponowanie efektów
  4. Kanały błędów i zależności
← Powrót do TypeScript Academy