Saltar al contenido
webtype.orgwebtype.orgtsconfig

    ↑↓ mover · ⏎ abrir · esc cerrar

    tsconfig

    exactOptionalPropertyTypes

    Ausente no es lo mismo que undefined

    `{ retries?: number }` normalmente también permite `{ retries: undefined }`. Esta bandera hace que el signo de interrogación signifique solo «puede faltar».

    Desde
    TypeScript 4.4
    strict
    Fuera de strict
    En tu tsconfig
    "exactOptionalPropertyTypes": true
    Compilado con
    "strict": true

    El mismo fragmento las dos veces. Solo cambió la opción.

    Con ella apagada

    "exactOptionalPropertyTypes": false
    type Options = { retries?: number }
    
    export const options: Options = { retries: undefined }

    Compila limpio

    Con ella encendida

    "exactOptionalPropertyTypes": true
    type Options = { retries?: number }
    
    export const options: Options = { retries: undefined }

    Emite TS2375

    Por qué al compilador le importa

    En ejecución son distintas y la diferencia sostiene cosas: `"retries" in options` es falso para una y verdadero para la otra, `Object.keys` lista una y no la otra, y una mezcla que expande valores por defecto dejará que el `undefined` explícito sobrescriba el predeterminado, cosa que la clave ausente no hace. Sin esta bandera el sistema de tipos no puede distinguirlas, así que la forma de API donde más importa —un objeto de opciones con valores por defecto— es justo la que no puede describir.

    Conclusión

    Escribe `retries?: number | undefined` cuando de verdad aceptes ambos.

    Adónde ir después

    22 opciones