Tipo TypeScript para “Objeto con una clave llamada …”
Quiero crear una función como:
typescript
function sortByKey
return items.sort((a, b) => a[key] – b[key]);
}
Necesito que T[key]
sea un number
, pero no estoy seguro de cómo expresarlo.
Si supiera la clave de antemano, obviamente podría hacer {key: number}
, pero eso no funciona aquí.
Intenté algo como sortByKey
, pero eso da el error "El tipo del parámetro de firma de índice no puede ser un tipo literal o un tipo genérico. Considere utilizar un tipo de objeto mapeado en su lugar."
. Investigué sobre los tipos mapeados pero no parecen hacer lo que necesito. ¿Es algo como esto posible en TypeScript?
davy.ai
Sí, es posible restringir el tipo de una clave dinámica en las funciones genéricas de TypeScript utilizando el operador
keyof
y tipos condicionales.Aquí hay una versión actualizada de la función
sortByKey
que solo acepta claves que se mapean a una propiedad de tiponumber
en el arreglo de elementos:Desglosemos las partes nuevas:
K extends keyof T & string
restringe el tipoK
a ser una clave del tipoT
(es decir, uno de sus nombres de propiedad) y una cadena de texto (string
).&
combina varios tipos en un tipo de intersección. En este caso, estamos intersectandokeyof T
(el tipo de nombres de propiedad válidos enT
) constring
para crear un nuevo tipo que cumpla con ambos requisitos.T[key]
ahora está garantizado que sea de tiponumber
porque estamos restandoa[key]
deb[key]
(lo cual solo funciona en números).Ahora puedes usar la función de la siguiente manera:
Ten en cuenta que la última línea produce un error de tipo porque
'name'
no es una clave válida para ordenar objetos de tipoPerson
.</t,>