exactOptionalPropertyTypes
Brakujące to nie to samo co undefined
`{ retries?: number }` normalnie dopuszcza też `{ retries: undefined }`. Ta flaga sprawia, że znak zapytania znaczy wyłącznie „może nie być”.
- Od
- TypeScript 4.4
- strict
- Poza strict
- W twoim tsconfigu
"exactOptionalPropertyTypes": true- Skompilowane z
"strict": true
Ten sam fragment za każdym razem. Zmieniła się tylko opcja.
Z wyłączoną
"exactOptionalPropertyTypes": falsetype Options = { retries?: number } export const options: Options = { retries: undefined }
Kompiluje się czysto
Z włączoną
"exactOptionalPropertyTypes": truetype Options = { retries?: number } export const options: Options = { retries: undefined }
Zgłasza TS2375
Dlaczego kompilator się tym przejmuje
W czasie wykonania to dwie różne rzeczy i ta różnica jest nośna: `"retries" in options` jest fałszem dla jednej i prawdą dla drugiej, `Object.keys` wymienia jedną, a drugiej nie, a scalanie rozkładające domyślne wartości pozwoli jawnemu `undefined` nadpisać domyślną, czego brakujący klucz nie zrobi. Bez tej flagi system typów nie umie ich rozróżnić — więc jedyny kształt API, w którym ma to największe znaczenie, obiekt opcji z domyślnymi wartościami, to dokładnie ten, którego nie potrafi opisać.
Wniosek
Napisz `retries?: number | undefined`, gdy naprawdę akceptujesz oba warianty.
Gdzie iść dalej
Opcji: 22

