TS1015
Interrogación y valor por defecto
Parameter cannot have question mark and initializer.Las palabras del propio compilador. Sin traducir — es la cadena que pegaste en el buscador.
Un valor por defecto ya hace opcional el parámetro, así que la interrogación no solo sobra — contradice la garantía que ese valor existe para dar.
Reproducción
function greet(name?: string = 'world') { return name.toUpperCase() }
La compilación afirma que esto emite exactamente este código.
Por qué lo dice el compilador
Las dos marcas hacen promesas distintas sobre el mismo parámetro. `?` dice que el argumento puede omitirse, y que dentro del cuerpo el parámetro puede ser `undefined`. `= "world"` dice que el argumento puede omitirse y que el parámetro será `"world"` — nunca `undefined`. El cuerpo solo puede comprobarse contra una de las dos, así que TypeScript se niega a registrar ambas y pregunta cuál querías.
Arreglos
- 01
function greet(name: string = 'world') { return name.toUpperCase() }
Conserva el valor por defecto y quita la interrogación. El parámetro sigue siendo opcional en la llamada; simplemente nunca es `undefined` dentro.
- 02
function greet(name?: string) { return (name ?? 'world').toUpperCase() }
O conserva la interrogación y gestiona tú la ausencia. Elige esto cuando el cuerpo necesite saber si quien llama dijo algo.
Conclusión
El valor por defecto es la promesa más fuerte: opcional en la llamada, nunca `undefined` dentro. La interrogación solo compra un caso que luego tienes que gestionar.

