The title is poor, but I don’t really know how to describe the problem better
Can someone please explain to me what the error is in this code:
type Variants0 = {
variant0: { v0: string };
variant1: { v1: string };
};
const callAllVariants = <S extends { [P in keyof Variants0] }>(
f: <V extends keyof S>(m: V) => S[V],
): { [V in keyof Variants0]: ReturnType<typeof f<V>> } => {
return {
variant0: f('variant0'),
variant1: f('variant1'),
};
};
const r0 = callAllVariants<Variants0>(<V extends keyof Variants0>(v: V) => {
return {
variant0: { v0: 'v0' },
variant1: { v1: 'v1' },
}[v];
});
type Variants1 = { [V in keyof Variants0]: Variants0[V] & { extra: number } };
const r1 = callAllVariants<Variants1>(
<V extends keyof Variants1>(vs: V): Variants1[V] => {
const r = {
variant0: { v0: 'v0', extra: 0 },
variant1: { v1: 'v1', extra: 1 },
}[vs];
// Doesn't work:
const r3: Variants0[V] & { extra: number } = r;
const r2: Variants1[V] = r3;
return r2;
// Works:
// return r;
},
);
The compile error is:
Type 'Variants0[V] & { extra: number; }' is not assignable to type 'Variants1[V]'.
Type 'Variants0[V] & { extra: number; }' is not assignable to type '{ v0: string; } & { extra: number; } & { v1: string; }'.
Type 'Variants0[V] & { extra: number; }' is not assignable to type '{ v0: string; }'
I don’t understand why Variants0[V] & { extra: number }
isn’t the equivalent type of Variants1[V]
If I comment out the r2
and r3
lines and uncomment the return r
then it compiles fine, but I don’t understand what the issue is… This is a simplified version of some code where I am having a similar issue but cant easily get rid of the intermediate types