Quiero manipular un objeto con una función que analice todas las claves dadas a un número. Además, la función debe crear el tipo correcto para el objeto.
Esto es lo que tengo hasta ahora:
type ReplaceStringWithNumber<T> = T extends string ? number : T type ReplaceStringsWithNumbers<T extends Record<PropertyKey, unknown>, K extends keyof T> = { [P in keyof T]: P extends K ? ReplaceStringWithNumber<T[P]> : T[P] } export function parseIntIfSet<T extends Record<string, unknown>, K extends keyof T>( object: T | ReplaceStringsWithNumbers<T, K>, key: K ): asserts object is ReplaceStringsWithNumbers<T, K> { if (object[key]) { object[key] = Number(object[key]) as T[K] } }Se ve bien por ahora, pero cuando pruebo la función:
const p = {id: '1'} parseIntIfSet(p, 'id') // `p.id` is of type `never`, because `p` is of type `{id: string} & {id: number}`Alguien sabe cómo resolver esto? Una solución que funciona es devolver un nuevo objeto con el tipo manipulado, pero esto no es exactamente lo que quiero.
Tampoco estoy seguro de por qué necesito usar T | ReplaceStringsWithNumbers<T, K> en los parámetros, ya que recibo un error si solo uso T .