A TypeScript ipari szabvannya valt a nagylepteku webfejlesztesben. Mig a legtobb fejleszto ismeri az interfeszek es tipusok alapjait, az igazi ero a halado tipusrendszerben rejlik. Ime 5 minta, amely megkulonboztet egy senior mernokot.
1. Generic Constraints
A generikusok hatalmasak, de neha korlatozni kell, mit lehet atadni. Az extends a baratod ebben.
interface HasId { id: string; } function getById<T extends HasId>(list: T[], id: string): T | undefined { return list.find((item) => item.id === id); }
Azzal, hogy biztositjuk, hogy T kiterjeszti a HasId-t, garantaljuk, hogy a .id elerese a fuggvenyen belul biztonsagos.
2. Conditional Types
A felteteles tipusok lehetove teszik nem egysegu tipuslekepezesek letrehozasat. A szintaxis hasonlo a JavaScript-beli ternar operatorhoz.
type IsString<T> = T extends string ? true : false; type A = IsString<string>; // true type B = IsString<number>; // false
Gyakorlati hasznalati eset a tipusok kiszurese egy uniobol:
type Diff<T, U> = T extends U ? never : T; type NonNullable<T> = Diff<T, null | undefined>;
3. Mapped Types
A lekkepezett tipusok lehetove teszik uj tipusok letrehozasat regiek alapjan a tulajdonsagok transzformalasaval.
type ReadOnly<T> = { readonly [P in keyof T]: T[P]; }; interface User { name: string; age: number; } type ReadOnlyUser = ReadOnly<User>;
Sot, modositokat is hozzaadhatsz vagy eltavolithatsz:
type Mutable<T> = { -readonly [P in keyof T]: T[P]; };
4. Template Literal Types
A TypeScript 4.1-ben bevezetve, ezek lehetove teszik a string tipusok kozvetlen manipulalasat.
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"
Ez hihetetlen hasznos olyan stringek tipizalasahoz, amelyek meghatarozott mintat kovetnek, mint peldaul CSS osztalyok vagy esemenynevek.
5. Az infer kulcsszo
A felteteles tipusokon beluli infer kulcsszo lehetove teszi tipusok kivonalasat mas tipusokbol.
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; function check(): boolean { return true; } type CheckReturn = ReturnType<typeof check>; // boolean
Itt arra kerjuk a TypeScript-et, hogy "kovetkeztesse ki" egy fuggveny R visszateresi tipusat es adja vissza.
Osszefoglalas
Ezeknek a mintaknak az elsajatitasa lehetove teszi, hogy robusztus konyvtarakat es segedeszközöket irj, amelyek kiváló fejlesztői élményt (DX) nyújtanak. A haladó TypeScript célja nem az összetettség az összetettség kedvéért, hanem a biztonság és a kifejezőerő.