function copyFields<T>(target: T, source: Partial<T>): T { for (let id in source) { target[id] = source[id]; // Error } return target; } let x = { a: 1, b: 2, c: 3, d: 4 }; copyFields(x, { b: 10, d: 20 }); El código anterior produce el error Type 'T[Extract<keyof T, string>] | undefined' is not assignable to type 'T[Extract<keyof T, string>]'. Type 'undefined' is not assignable to type 'T[Extract<keyof T, string>]' .
¿La source no siempre es parte del target ?
¿Cuál es el problema?
El tipo Type 'T[Extract<keyof T, string>] | undefined puede ser undefined , que no se puede asignar al tipo Type 'T[Extract<keyof T, string>] .
Su source de entrada puede tener una propiedad que se ha establecido explícitamente en undefined , que no se podría asignar a la propiedad equivalente en el target .
Debe verificar este caso, aunque parece que esta condición no es suficiente para que TypeScript determine que definitivamente no está undefined . Sin embargo, puede aplicar el operador de aserción no nulo de TypeScript para asegurarse de que TypeScript se dé cuenta de que esto significa que la propiedad no está undefined :
function copyFields<T>(target: T, source: Partial<T>): T { for (let id in source) { const sourceProp = source[id]; if (typeof sourceProp !== 'undefined') { target[id] = sourceProp!; // No error here } } return target; } let x = { a: 1, b: 2, c: 3, d: 4 }; copyFields(x, { b: 10, d: 20 });