Saltar al contenido
webtype.orgwebtype.orgTS1015

    ↑↓ mover · ⏎ abrir · esc cerrar

    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

    1. 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.

    2. 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.

    Adónde ir después

    Errores