Typescript forstår ikke udefineret returtype, når det bruges med valgfri kædning
Jeg har en meget simpel kode:
const foo = (state: RootState): MyData => undefined;
Dette giver en fejl:
Type 'undefined' kan ikke tildeles typen 'MyData'.
Hvilket er ret rimeligt, da min type MyData ikke tillader udefineret.
Men hvis jeg nu skriver dette:
const foo = (state: RootState): MyData => state.data?.myData;
Så kompilerer det uden problemer. Jeg forstår ikke, hvad der foregår her, da hvis state.data er udefineret, så burde det virkelig returnere udefineret og burde være ganske indlysende for compileren.
Misser jeg noget her?
P.S. Dette er det minimale eksempel på typer:
type State = {
data: {
myData: MyData;
};
}
type MyData = {
}
Svar #1
Det lyder som om data ikke er valgfri i RootState.
TypeScript klager over begge disse funktioner, da — som du siger — MyData | undefined ikke kan tildeles til MyData:
interface RootState {
data?: {
myData: MyData;
}
}
interface MyData {
bar: string;
}
const foo1 = (state: RootState): MyData => undefined;
const foo2 = (state: RootState): MyData => state.data?.myData;
Legeplads link
Men det er godt, hvis data i RootState ikke er valgfri:
interface RootState {
data: {
myData: MyData;
}
}
Legeplads link
Det er glad, fordi TypeScript-kompileren ved, at ? der ikke er funktionel, fordi data ikke er valgfri, ikke kan have værdien undefined, og ikke kan have værdien null. Så state.data.myData og state.data?.myData gør præcis det samme: giver en værdi af typen MyData.
