TypeScript se stal prumyslovym standardem pro vyvoj webovych aplikaci ve velkem meritku. Zatimco vetsina vyvojaru zna zaklady rozhrani a typu, skutecna sila spociva v jeho pokrocilem typovem systemu. Zde je 5 vzoru, ktere vas odlisi jako seniorni inzenyre.
1. Generic Constraints
Genericke typy jsou mocne, ale nekdy potrebujete omezit, co lze predat. extends je zde vasim pritelem.
interface HasId { id: string; } function getById<T extends HasId>(list: T[], id: string): T | undefined { return list.find((item) => item.id === id); }
Tim, ze zajistime, aby T rozsiroval HasId, zarucujeme, ze pristup k .id uvnitr funkce je bezpecny.
2. Conditional Types
Podminene typy vam umoznuji vytvaret neuniformni mapovani typu. Syntaxe je podobna ternarnimu operatoru v JavaScriptu.
type IsString<T> = T extends string ? true : false; type A = IsString<string>; // true type B = IsString<number>; // false
Praktickym pripadem pouziti je filtrovani typu z unie:
type Diff<T, U> = T extends U ? never : T; type NonNullable<T> = Diff<T, null | undefined>;
3. Mapped Types
Mapovane typy vam umoznuji vytvaret nove typy na zaklade starych transformaci vlastnosti.
type ReadOnly<T> = { readonly [P in keyof T]: T[P]; }; interface User { name: string; age: number; } type ReadOnlyUser = ReadOnly<User>;
Muzete dokonce pridavat nebo odebirat modifikatory:
type Mutable<T> = { -readonly [P in keyof T]: T[P]; };
4. Template Literal Types
Predstaveny v TypeScript 4.1, umoznuji primo manipulovat s retezovymi typy.
type World = 'world'; type Greeting = `hello ${World}`; // "hello world" type Color = 'red' | 'blue'; type Quantity = 'light' | 'dark'; type Palette = `${Quantity}-${Color}`; // "light-red" | "light-blue" | "dark-red" | "dark-blue"
To je neuvitelne uzitecne pro typovani retezcu, ktere nasleduji urcity vzor, jako jsou CSS tridy nebo nazvy udalosti.
5. Klicove slovo infer
Klicove slovo infer v ramci podminenych typu vam umoznuje extrahovat typy z jinych typu.
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; function check(): boolean { return true; } type CheckReturn = ReturnType<typeof check>; // boolean
Zde zadame TypeScript, aby "odvodil" navratovy typ R funkce a vratil ho.
Zaver
Zvladnuti techto vzoru vam umozni psat knihovny a utility, ktere jsou robustni a poskytuji vyborny vyvojarsky zazitek (DX). Cilem pokrocileho TypeScriptu neni slozitost pro slozitost, ale bezpecnost a expresivita.