typescript - strictNullChecks forårsaker feil: hasOwnProperty eksisterer ikke for generiske typer
Koden min fungerer bra uten --strictNullChecks.
Når --strictNullChecks aktiveres, oppstår følgende feil:
Egenskapen 'hasOwnProperty' finnes ikke på typen 'T1'.
Egenskapen 'hasOwnProperty' finnes ikke på typen '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;
}
Svar #1
Siden de er ubundne generiske typer, kan T1 eller T2 være null eller undefined, hvor ingen av dem har hasOwnProperty.
Du må merke dem som å utvide objekt:
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;
}
Svar #2
Du kan finne mer om emnet her, men i hovedsak vet ikke Typescript at din generiske type er et objekt.
Det antas, og med god grunn, at det kan være hva som helst, inkludert en streng, et tall eller til og med null. Så det ville ikke gi noen mening å tillate deg å kalle hasOwnProperty på disse.
Du må spesifisere dine generiske typer litt mer enn det.
function extend<T1 extends object, T2 extends object>(arg1: T1, arg2: T2): T1 & T2;
