0Pricing
TypeScript Academy · Lekcja

Doprecyzowywanie unii między granicami funkcji

Przenoszenie bezpiecznego zawężania między granicami funkcji za pomocą unii rozróżnianych, zwracanych predykatów i typów w stylu Result

Doprecyzowywanie unii między granicami funkcji to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 3 z 3. 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 3 lekcji w sumie.

Wprowadzenie

Cel: zachować zawężanie podczas wywołań funkcji za pomocą unii tagowanych, zwracanych predykatów i pomocników walidacji.

  • Zero niebezpiecznych as w miejscach wywołań
  • Doprecyzowanie typu podróżuje razem z danymi

Zwracanie unii tagowanej

Wzorzec Result: wywołujący zawęża typ, sprawdzając ok. Bez rzutowań i z przejrzystym przepływem sterowania.

type Ok<T> = { ok: true; value: T }
type Err = { ok: false; error: string }

type Result<T> = Ok<T> | Err

function parseIntSafe(s: string): Result<number> {
  const n = Number(s)
  return Number.isFinite(n) ? { ok: true, value: n } : { ok: false, error: "NaN" }
}

function useIt(s: string) {
  const r = parseIntSafe(s)
  if (r.ok) {
    // r is Ok<number>
    return r.value * 2
  }
  // r is Err
  return `bad: ${r.error}`
}

Zwracanie predykatu

Predykaty zwracające (x is T) centralizują sprawdzanie i zachowują doprecyzowanie typu w miejscach wywołań.

type User = { id: number; name: string }

type MaybeUser = User | null

function hasUser(x: MaybeUser): x is User {
  return x !== null
}

function greet(x: MaybeUser) {
  if (hasUser(x)) {
    // x narrowed to User
    return `Hello ${x.name}`
  }
  return "Anonymous"
}

Przekazywanie doprecyzowania

Zawęź typ za pomocą guarda (np. isCircle), a następnie przekaż wartość dalej; funkcje niższego poziomu zobaczą węższy typ.

type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; size: number }

function isCircle(s: Shape): s is Extract<Shape, { kind: "circle" }> {
  return s.kind === "circle"
}

function area(s: Shape) {
  if (isCircle(s)) {
    // s is circle here
    return Math.PI * s.radius * s.radius
  }
  return s.size * s.size
}

Walidacja na granicy

Przeprowadź walidację na granicy i zwróć Valid/Invalid; wywołujący zawęża typ na podstawie tagu i otrzymuje w pełni typowane dane.

type Payload = { email: string; retries?: number }

type Valid = { ok: true; data: Required<Payload> }
type Invalid = { ok: false; issues: string[] }

type Validation = Valid | Invalid

function validate(p: unknown): Validation {
  const issues: string[] = []
  if (typeof p !== "object" || p === null) return { ok: false, issues: ["not an object"] }
  const x = p as any
  if (typeof x.email !== "string") issues.push("email:string")
  if (x.retries !== undefined && typeof x.retries !== "number") issues.push("retries:number")
  if (issues.length) return { ok: false, issues }
  return { ok: true, data: { email: x.email, retries: x.retries ?? 0 } }
}

function handle(p: unknown) {
  const v = validate(p)
  if (!v.ok) return `bad: ${v.issues.join(",")}`
  // v.data is fully typed here
  return `send to ${v.data.email} (${v.data.retries})`
}

Wskazówki

Najlepsze praktyki:

  • Preferuj małe, stabilne tagi (ok, kind)
  • Centralizuj sprawdzanie w pomocnikach predykatowych
  • Używaj wyczerpujących instrukcji switch w miejscach wywołań
  • Unikaj any i niebezpiecznych rzutowań

Zawężanie przez granice

Szybkie sprawdzenie: który wzorzec najlepiej zachowuje zawężanie typów przez granice funkcji?

Podsumowanie

Podsumowanie: przenoś doprecyzowanie jako dane (Result), przeprowadzaj walidację na granicach i unikaj niebezpiecznych rzutowań; wywołujący zawęża typ za pomocą prostych sprawdzeń tagów.

Często zadawane pytania

Czy lekcja „Doprecyzowywanie unii między granicami funkcji” jest bezpłatna?

Tak — pełny tekst „Doprecyzowywanie unii między granicami funkcji” 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 3 lekcji w sumie.

Co nauczysz się w „Doprecyzowywanie unii między granicami funkcji”?

Przenoszenie bezpiecznego zawężania między granicami funkcji za pomocą unii rozróżnianych, zwracanych predykatów i typów w stylu Result Ć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 3.

Ile czasu zajmuje lekcja „Doprecyzowywanie unii między granicami funkcji”?

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. Kompletne instrukcje switch i sprawdzanie never
  2. Funkcje predykatów i operator satisfies
  3. Doprecyzowywanie unii między granicami funkcji
← Powrót do TypeScript Academy