Sobes.tech
Middle

Czym są generyki?

sobes.tech AI

Odpowiedź od AI

Generyki w TypeScript pozwalają na tworzenie komponentów (funkcji, klas, interfejsów), które mogą działać z różnymi typami danych, zachowując bezpieczeństwo typów. Umożliwiają pisanie bardziej elastycznego i wielokrotnego użytku kodu, nie tracąc zalet statycznego typowania. Najprostszy przykład to użycie generyków w funkcjach do zwracania tego samego typu, co został przekazany jako argument.

// Funkcja, która przyjmuje argument dowolnego typu i zwraca go
function identity<T>(arg: T): T {
    return arg;
}

// Użycie generyku z konkretnym typem - string
let outputString = identity<string>("łańcuch"); // Typ outputString będzie string

// Użycie generyku z automatycznym wyprowadzeniem typu - number
let outputNumber = identity(123); // Typ outputNumber będzie number

Generyki można również używać w klasach:

// Klasa pracująca z elementami dowolnego typu
class GenericBox<T> {
    value: T;
    constructor(initialValue: T) {
        this.value = initialValue;
    }
}

// Tworzenie instancji GenericBox z typem string
let stringBox = new GenericBox<string>("cześć");
// Tworzenie instancji GenericBox z typem boolean
let booleanBox = new GenericBox(true); // TypeScript wywnioskuje typ

I w interfejsach:

// Interfejs z generykiem
interface KeyValuePair<K, V> {
    key: K;
    value: V;
}

// Użycie interfejsu z konkretnymi typami
let stringNumberPair: KeyValuePair<string, number> = { key: "wiek", value: 30 };

Zalety używania generyków:

  • Ponowne użycie kodu: Jedna struktura może być używana z różnymi typami danych.
  • Bezpieczeństwo typów: Kompilator sprawdza typy podczas kompilacji, zapobiegając potencjalnym błędom.
  • Czytelność i utrzymanie: Kod staje się bardziej zrozumiały, ponieważ wyraźnie widać, z jakimi typami pracuje komponent.

Generyki są często używane w bibliotekach i frameworkach, takich jak React (do typowania propsów komponentów), Redux (do typowania store), a także przy pracy z kolekcjami danych.