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

Relaterte artikler