Tengo una función de orden superior que inyectará una clave/valor en un objeto y lo devolverá.
import { v4 as uuid } from 'uuid'; const withPrimaryKey = (key: string) => <T>(input: T) => { return { ...input, [key]: uuid() } } export default withPrimaryKey;En uso, se vería así:
const injectPrimaryKey = withPrimaryKey('categoryId'); const input = { name: 'books' }; const data = injectPrimaryKey(input); console.log(data); // { categoryId: '25b9dea6-5856-4c53-bfef-c2505eacae15', name: 'books' } Tal como está, funciona bien... sin embargo, la tipificación del objeto de data devuelto no indica que existe el ID de categoryId . Y hacer lo siguiente arroja un error de mecanografiado:
const data: typeof input & { categoryId: string } = insertPrimaryKey(input);Falta la propiedad 'categoryId' en el tipo [...]
¿Cómo escribo correctamente mi función withPrimaryKey para incluir dinámicamente el ID de categoryId y, si eso no es posible, cuál es la siguiente mejor opción?
Puede cambiar el tipo de key a genérico y usar la aserción de tipo para el valor de retorno (sin la aserción de tipo, K se amplía a string ):
const withPrimaryKey = <K extends string>(key: K) => <T>(input: T) => { return { [key]: uuid(), ...input, } as Record<K, string> & T }