TypeScript har blivit industristandarden för storskalig webbutveckling. Medan de flesta utvecklare kÀnner till grunderna med interfaces och typer, ligger den verkliga kraften i det avancerade typsystemet. HÀr Àr 5 mönster som kommer att sÀrskilja dig som senior ingenjör.
1. Generic Constraints
Generics Àr kraftfulla, men ibland behöver du begrÀnsa vad som kan skickas in. extends Àr din vÀn hÀr.
interface HasId { id: string; } function getById<T extends HasId>(list: T[], id: string): T | undefined { return list.find((item) => item.id === id); }
Genom att sÀkerstÀlla att T utökar HasId, garanterar vi att Ätkomst till .id inuti funktionen Àr sÀker.
2. Conditional Types
Conditional types lÄter dig skapa icke-uniforma typmappningar. Syntaxen liknar den ternÀra operatorn i JavaScript.
type IsString<T> = T extends string ? true : false; type A = IsString<string>; // true type B = IsString<number>; // false
Ett praktiskt anvÀndningsfall Àr att filtrera bort typer frÄn en union:
type Diff<T, U> = T extends U ? never : T; type NonNullable<T> = Diff<T, null | undefined>;
3. Mapped Types
Mapped types lÄter dig skapa nya typer baserade pÄ befintliga genom att transformera egenskaper.
type ReadOnly<T> = { readonly [P in keyof T]: T[P]; }; interface User { name: string; age: number; } type ReadOnlyUser = ReadOnly<User>;
Du kan till och med lÀgga till eller ta bort modifierare:
type Mutable<T> = { -readonly [P in keyof T]: T[P]; };
4. Template Literal Types
Introducerade i TypeScript 4.1, dessa lÄter dig manipulera strÀngtyper direkt.
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"
Detta Àr otroligt anvÀndbart för att typa strÀngar som följer ett specifikt mönster, som CSS-klasser eller hÀndelsenamn.
5. Nyckelordet infer
Nyckelordet infer inom conditional types lÄter dig extrahera typer frÄn andra typer.
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; function check(): boolean { return true; } type CheckReturn = ReturnType<typeof check>; // boolean
HĂ€r ber vi TypeScript att "inferera" returtypen R av en funktion och returnera den.
Slutsats
Att behÀrska dessa mönster gör det möjligt att skriva bibliotek och verktyg som Àr robusta och ger en utmÀrkt utvecklarupplevelse (DX). MÄlet med avancerad TypeScript Àr inte komplexitet för komplexitetens skull, utan sÀkerhet och uttrycksfullhet.