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
- 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.
- 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ć.

