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
asw 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
anyi 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
- Kompletne instrukcje switch i sprawdzanie never
- Funkcje predykatów i operator satisfies
- Doprecyzowywanie unii między granicami funkcji