Przejdź do treści
webtype.orgwebtype.orgTS1015

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS1015

    Znak zapytania i wartość domyślna

    Parameter cannot have question mark and initializer.

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

    Wartość domyślna już czyni parametr opcjonalnym, więc znak zapytania nie jest tylko zbędny — przeczy gwarancji, dla której ta wartość istnieje.

    Odtworzenie

    function greet(name?: string = 'world') {
      return name.toUpperCase()
    }

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

    Dlaczego kompilator tak mówi

    Oba znaki składają inne obietnice o tym samym parametrze. `?` mówi, że argument można pominąć, a więc że wewnątrz ciała parametr może być `undefined`. `= "world"` mówi, że argument można pominąć, a parametr będzie wtedy `"world"` — nigdy `undefined`. Ciało da się sprawdzić tylko względem jednej z tych wersji, więc TypeScript odmawia zapisania obu i pyta, którą miałeś na myśli.

    Naprawy

    1. 01
      function greet(name: string = 'world') {
        return name.toUpperCase()
      }

      Zostaw wartość domyślną i usuń znak zapytania. Parametr nadal jest opcjonalny w wywołaniu; po prostu nigdy nie jest `undefined` w środku.

    2. 02
      function greet(name?: string) {
        return (name ?? 'world').toUpperCase()
      }

      Albo zostaw znak zapytania i sam obsłuż brak wartości. Wybierz to, gdy ciało musi wiedzieć, czy wywołujący w ogóle cokolwiek podał.

    Wniosek

    Wartość domyślna to silniejsza obietnica: opcjonalny w wywołaniu, nigdy `undefined` w środku. Znak zapytania kupuje tylko przypadek, który potem musisz obsłużyć.

    Dokąd dalej

    Błędy