Estoy tratando de comparar si existe un elemento en otra matriz al verificar un valor de propiedad común. Para el siguiente código, está arrojando el siguiente error:
TS2367: esta condición siempre devolverá 'falso' ya que los tipos 'U[K]' y 'T[K]' no se superponen.
const sourceArray = [{requestId: "1", name: "henry"},{requestId: "2", name: "bob"}] const arrayListToCompareWith = [{requestId: "1", age: 30}, {requestId: "9", age: 40}] const commonItems = getItemsInSourceArrayWhichArePresentInArrayToBeComparedWith(sourceArray,arrayListToCompareWith, "requestId" ) function getItemsInSourceArrayWhichArePresentInArrayToBeComparedWith< T, U, K extends keyof T & keyof U, >( sourceArray: T[], arrayListToCompareWith: U[], comparisonKey: K, // "requestId" ) { const itemsInSourceArrayWhichAreNotPresentInArrayToBeComparedWith: T[] = sourceArray.filter((sourceArrayItem: T): boolean => { const { [comparisonKey]: sourceArrayItemComparisonKeyValue } = sourceArrayItem; sourceArrayItemComparisonKeyValue const itemExistsInTheArrayWeAreComparingWith: boolean = arrayListToCompareWith.some((itemToCompareWith: U): boolean => { const comparisonValueInItemToCompareWith = itemToCompareWith[comparisonKey]; // U[K] const comparisonValueInSource = sourceArrayItemComparisonKeyValue; //T[K] // TS2367: This condition will always return 'false' since the types 'U[K]' and 'T[K]' have no overlap. const check = comparisonValueInItemToCompareWith === comparisonValueInSource; return check; }); return itemExistsInTheArrayWeAreComparingWith; }); return itemsInSourceArrayWhichArePresentInArrayToBeComparedWith; }A continuación se muestra el enlace del patio de juegos de TS para el problema de código anterior:
El problema es que no le dijo a Typescript que existe alguna relación entre T y U , en particular, no dijo que deben tener el mismo tipo de valor para la propiedad K .
En realidad, no hay necesidad de su segundo parámetro de tipo U ; todo lo que necesitamos decir es que la segunda matriz contiene objetos que tienen una clave K con el mismo tipo de valor que T Esto se puede escribir más simplemente como Pick<T, K> .
function filterByKey<T, K extends keyof T>(arr: T[], keysToKeep: Pick<T, K>[], key: K) { return arr.filter( item => keysToKeep.some( otherItem => item[key] === otherItem[key] ) ); }