Przejdź do treści
webtype.orgDwanaście zagadnień · 2/12

Zagadnienie 2 z 12

Parametry generyczne

Parametr generyczny zamienia alias w funkcję, która przyjmuje typy i zwraca typ. Gdy raz przeczytasz to w ten sposób — argumenty na wejściu, typ na wyjściu — reszta systemu typów przestaje wyglądać jak składnia, a zaczyna jak programowanie.

Parametry, wartości domyślne i reszta

type Box<T> = { value: T }
type Boxed = Box<string>        // { value: string }

// Defaults work exactly like function parameter defaults.
type List<T, Sep extends string = ','> = { items: T[]; sep: Sep }
type Plain = List<number>       // sep is ','

Parametry typowe są pozycyjne, mogą mieć wartości domyślne, a te mogą odwoływać się do wcześniejszych parametrów. Rekurencyjny kod na typach opiera się na tym stale: akumulator to prawie zawsze parametr z wartością domyślną, którego wywołujący nigdy nie podaje.

`extends` znaczy tu „musi być co najmniej”

type Length<S extends string> = S['length']

Length<'abc'>   // ok
Length<42>      // Error: 42 does not satisfy the constraint 'string'

Na liście parametrów `extends` jest ograniczeniem: zawęża to, co wolno przekazać. To nie dziedziczenie i nie oznacza, że parametr *jest* tym typem — jedynie że to, co przyjdzie, da się do niego przypisać.

To samo słowo kluczowe znaczy coś zupełnie innego wewnątrz typu warunkowego, gdzie zadaje pytanie, zamiast narzucać regułę. Odróżnianie ich po pozycji to jedna z prawdziwych przeszkód w nauce.

Najczęstsza błędna odpowiedź

// Intent: accept any object and read a key from it.
type Get<T, K> = T[K]
//                 ^ Error: type K cannot be used to index type T

// Fixed: constrain K to the keys T actually has.
type Get2<T, K extends keyof T> = T[K]

Bez ograniczenia kompilator nie ma powodu wierzyć, że `K` jest poprawnym kluczem, więc odmawia. Ograniczenia nie są ozdobą — to one pozwalają ciału typu generycznego cokolwiek zrobić z parametrami.

Do zapamiętania

Czytaj `type F<A, B> = ...` jak funkcję z typów w typy. `extends` na liście parametrów to kontrola argumentów przy wejściu.