Búsqueda de sitios web

typescript - Cómo resolver el error TS2532: El objeto podría ser 'undefined'


Tengo código donde debería comprobar una condición complicada varias veces. Por ejemplo: (a && b) || c, etc. Intenté agregar una variable con mi condición como const hasSomething=(a && b) || c, y me enfrenté con un problema con TS que no puedo resolver.

Ejemplos de trabajos:

function add(a?: number, b?: number): number {

    if (a && b) {
        return a + b;
    }
    return 0;
}

No funciona:

function add(a?: number, b?: number): number {
    const hasNumbers = a && b;

    if (hasNumbers) {
        return a + b;
               ^   ^
               TS2532: Object is possibly 'undefined'.
    }
    return 0;
}

¿Hay alguna solución para arreglarlo sin la afirmación de no nulo !?

Respuesta #1

Fácil de arreglar :D. Solo actualiza la versión de TypeScript a 4.4:

function add(a?: number, b?: number): number {
    const hasNumbers = a && b;
    if (hasNumbers) {
        return a + b;
    }
    return 0;
}

Parque infantil

Respuesta #2

el operador && (y) con números no funciona como se espera:

si lo usas así:

const foo = 3 && 4

puedes ver que el typeof foo es "número".

De hecho, el operador && devuelve:

  • el último número si el resultado será verdadero, ejemplo: 5 && 4 es true por lo que devolverá 4

  • el valor falso es cuando hay uno: por ejemplo 0 && 4 tiene 0 como valor falso y devolverá 0, lo mismo con undefined && 4 esto devolverá undefined

Las versiones de TypeScript inferiores a 4.4.0 no entenderán realmente cuál será el resultado real debido a que podría ser undefined hasta donde yo sé.

dicho esto, también es una mala práctica usar number && number cuando al menos uno de los dos valores puede ser 0 debido al hecho de que 0 es un valor falso y en tu función cualquier suma con 0 resultará en una respuesta 0 según la comprobación a && b.

Te sugiero simplemente hacer que los parámetros de la función sean obligatorios para evitar el error y evitar la verificación hasNumbers:

function add(a: number, b: number): number {

    return a + b
}