Typescript returnerar inte inbäddad typ när det returnerar inbäddat objekt
Jag vill att min funktion ska returnera en nästlad typ av Content men det fungerar inte även när vi är säkra på vilken typ som borde returneras. Låt oss titta på ett exempel:
type Content = {
some: {
extra: string;
prop: number;
},
other: string,
somenumber: number
}
const factory = (content: Content) => {
return (key: keyof Content) => {
return content[key];
};
};
const content:Content = {
some: {
extra: "wow",
prop: 123
},
other: "abc",
somenumber: 999
};
const el = factory(content);
const some = el("some"); // good, I can pass only existing key as a string
console.log(some.extra); // error, can't reach "extra"
LIVE EXEMPEL
Jag förväntar mig att "some" innehåller och föreslår "extra" och "prop", men att ta "extra" orsakar problem i TypeScript.
Svar #1
Definiera din funktion med en generisk typparameter så att Typescript kan härleda typerna korrekt:
const factory = (content: Content) => {
return <K extends keyof Content>(key: K) => {
return content[key];
};
};
Se detta levande exempel.
Svar #2
Lösningen är ganska enkel:
const factory = (content: Content) => {
return <T extends keyof Content>(key: T) => {
return content[key];
};
};
Skillnaden är att vi nu begränsar typen av key till den passade strängliteralen istället för vilken Content-nyckel som helst
