Code
// Pack<{ a: number }> is { a: { value: number } }
type Pack<T> = { [K in keyof T]: { value: T[K] } };
function patch<T, K extends keyof T>(obj: Partial<Pack<T>>, key: K, value: T[K]) {
obj[key] = { value }; // error: Type '{ value: T[K]; }' is not assignable to type 'Pack<T>[K]'.
}
Example usage of patch():
type SomeType = {
a: number, b: string
};
const obj: Partial<Pack<SomeType>> = {
a: { value: 1 }
}
patch(obj, 'b', 'foo'); // desired outcome is for obj.b to equal 'foo'
Expected behavior:
Definition of patch() function should be fine, and calling should produce the desired outcome.
Actual behavior:
patch() function fails to compile with error Type '{ value: T[K]; }' is not assignable to type 'Pack<T>[K]' even though { value: T[K] } does appear to be assignable to Pack<T>[K]:
function getPack<T, K extends keyof T>(obj: T, key: K): Pack<T>[K] {
const value = obj[key]; // T[K]
return { value }; // { value: T[K]; }
}
Playground Link:
Additional examples here: https://bit.ly/2le5qZq
Code
Example usage of
patch():Expected behavior:
Definition of
patch()function should be fine, and calling should produce the desired outcome.Actual behavior:
patch()function fails to compile with errorType '{ value: T[K]; }' is not assignable to type 'Pack<T>[K]'even though{ value: T[K] }does appear to be assignable toPack<T>[K]:Playground Link:
Additional examples here: https://bit.ly/2le5qZq