Typescript Delvis av utvidet typeegenskap [TS2322]
Jeg har problemer med å forklare problemet mitt, så mitt beste alternativ er egentlig et minimalt eksempel. Se nedenfor:
type Result = {
prop1: {
val1: number,
val2: string
},
prop2: {
val1: number
}
};
function somefn<T extends Result>(): Partial<T['prop1']> {
return({val1: 1}); // <- Error: Type '{ val1: 1; }' is not assignable to type 'Partial<T["prop1"]>'.ts(2322)
}
Hvorfor blir ikke {val1: 1} oppdaget som gyldig Partial<T['prop1']> for noen T. Er det ikke det? Enhver type som utvider Result bør ha prop1.val1: number. Eller er det noe ved dette som jeg ikke forstår?
Rediger: Om innskrenkingen av tall. Hvordan kommer det seg at følgende ikke gir en feil?
type Result = {
prop1: {
val1: number
},
prop2: {
val1: number
}
};
function somefn<T extends Result>(): Partial<T['prop1']> {
return({val1: 1});
}
Med val1 som den eneste egenskapen, ser det ut til å være greit med det.
Svar #1
Ikke alle typer som utvider Result kan ha et hvilket som helst tall (som 1) i prop1.val1. Ta for eksempel denne AnnoyingResult:
type AnnoyingResult = {prop1: {val1: 0, val2: '0'}, prop2: {val1: 0}}
Den utvider Result, så
const x = somefn<AnnoyingResult>()
er et gyldig kall, men prop1.val1 har typen 0, så {val1: 1} kan ikke tildeles Partial<AnnoyingResult['prop1']>, noe som er det typefeilen signaliserer.
Funksjonen returnOne nedenfor er et enklere eksempel på det samme problemet:
function returnOne <T extends number>(): T {
return 1;
// Error: Type 'number' is not assignable to type 'T'.
// 'number' is assignable to the constraint of type 'T',
// but 'T' could be instantiated with a different subtype of constraint 'number'.
}
TypeScript-lekeplass
