Przejdź do treści
webtype.orgwebtype.orgtsconfig

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    tsconfig

    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": false
    type Options = { retries?: number }
    
    export const options: Options = { retries: undefined }

    Kompiluje się czysto

    Z włączoną

    "exactOptionalPropertyTypes": true
    type 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