Búsqueda de sitios web

typescript - strictNullChecks causa error: hasOwnProperty no existe para tipos genéricos


Mi código funciona bien sin --strictNullChecks.

Al habilitar --strictNullChecks, ocurre el siguiente error:

La propiedad 'hasOwnProperty' no existe en el tipo 'T1'.
La propiedad 'hasOwnProperty' no existe en el tipo 'T2'.

function extend<T1, T2>(arg1: T1, arg2: T2): T1 & T2 {
    const result: Partial<T1 & T2> = {};
    for (const prop in arg1) {
        if (arg1.hasOwnProperty(prop)) { // error when using --strictNullChecks
            (result as T1)[prop] = arg1[prop];
        }
    }
    for (const prop in arg2) {
        if (arg2.hasOwnProperty(prop)) { // error when using --strictNullChecks
            (result as T2)[prop] = arg2[prop];
        }
    }
    return result as T1 & T2;
}

Respuesta #1

Dado que son genéricos sin restricciones, T1 o T2 podrían ser null o undefined, ninguno de los cuales tiene hasOwnProperty.

Necesitarás marcarlos como que extienden un objeto:

function extend<T1 extends object, T2 extends object>(arg1: T1, arg2: T2): T1 & T2 {
// ---------------^^^^^^^^^^^^^^^-----^^^^^^^^^^^^^^
    const result: Partial<T1 & T2> = {};
    for (const prop in arg1) {
        if (arg1.hasOwnProperty(prop)) { // error when using --strictNullChecks
            (result as T1)[prop] = arg1[prop];
        }
    }
    for (const prop in arg2) {
        if (arg2.hasOwnProperty(prop)) { // error when using --strictNullChecks
            (result as T2)[prop] = arg2[prop];
        }
    }
    return result as T1 & T2;
}

Respuesta #2

Puedes encontrar más sobre el tema aquí, pero básicamente TypeScript no sabe que tu tipo genérico es un objeto.

Se asume, y con razón, que podría ser cualquier cosa, incluyendo una cadena, un número o incluso nulo. Por lo tanto, no tendría ningún sentido permitir que llames a hasOwnProperty sobre esos.

Necesitas especificar tus tipos genéricos un poco más que eso.

function extend<T1 extends object, T2 extends object>(arg1: T1, arg2: T2): T1 & T2;

Artículos relacionados