Przejdź do treści

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS2344

    Nie spełnia ograniczenia

    Type 'number' does not satisfy the constraint 'string'.

    Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.

    Argument typu został odrzucony w drzwiach. Generyk powiedział, co przyjmie, a to nie jest to.

    Odtworzenie

    type OnlyStrings<T extends string> = T
    
    type Bad = OnlyStrings<number>

    Build potwierdza, że to emituje dokładnie ten kod.

    Dlaczego kompilator tak mówi

    `extends` na liście parametrów to nie dziedziczenie i nie podpowiedź — to kontrola argumentu. `T extends string` znaczy „cokolwiek przyjdzie, musi dać się przypisać do `string`”, a `number` się nie da. Błąd najpierw nazywa argument, a potem ograniczenie, i warto to czytać uważnie: mówi ci, którą stronę pomyliłeś.

    Naprawy

    1. 01
      type OnlyStrings<T extends string> = T
      
      type Good = OnlyStrings<'hello'>

      Przekaż coś, co pasuje. Literalny typ tekstowy daje się przypisać do `string`, więc wchodzi bez pytania.

    2. 02
      type Anything<T extends string | number> = T
      
      type AlsoGood = Anything<number>

      Albo poszerz ograniczenie, jeśli generyk naprawdę udźwignie więcej, niż deklaruje. Poszerzanie dlatego, że błąd irytuje, a nie dlatego, że ciało jest bezpieczne, tylko przesuwa awarię do środka.

    Wniosek

    Ograniczenie to kontrakt, który generyk napisał sam o sobie. Przeczytaj ciało, zanim je poluzujesz — ograniczenie zwykle jest nośne.

    Dokąd dalej

    Błędy