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;
