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": falsetype Options = { retries?: number } export const options: Options = { retries: undefined }
Compila limpio
Con ella encendida
"exactOptionalPropertyTypes": truetype 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

