Problema al inferir el tipo con Typescript
Estoy tratando de crear una interfaz para mi base de datos Realm usando TypeScript.
Básicamente, tengo un bot de automatización y quiero hacer un seguimiento de cómo la gente lo está usando y cuánto. Para eso, hice algunos esquemas que quiero agregar a una base de datos interna y poder recuperar la información más tarde.
Así que hice una interfaz para esta base de datos de Realm. La idea es que yo proporcione qué entidad quiero agregar o recuperar y Typescript me daría el objeto de la entidad como tipo de retorno.
Definí los modelos de los objetos de la entidad de la siguiente manera:
export type AllEntitiesModel = {
copypastas: {
group: string;
requester: string;
};
googleSearches: {
group: string;
requester: string;
query: string;
};
};
Y he creado un enum que contiene todos mis tipos de entidad:
export enum EntityTypes {
COPYPASTAS = 'copypastas',
GOOGLESEARCHES = 'googleSearches',
}
Si creo un tipo como
type CopypastaModel = AllEntitiesModel[EntityTypes.COPYPASTAS];
Funciona, sabe que el ModeloCopypasta debería ser
copypastas: {
group: string;
requester: string;
};
Lo que estoy tratando de lograr es tener una función que pueda hacer esto pero a partir del tipo del argumento que le estoy pasando.
Tendría una función con idealmente esta firma
function getAllEntities(entityType: EntityTypes) => AllEntitiesModel[entityType]
donde este entityType es un argumento que paso a la función. En otras palabras, quiero que TypeScript sepa que si llamo a getAllEntities(EntityTypes.COPYPASTAS) espero que devuelva un objeto de tipo AllEntitiesModel.copypasta y si llamo a getAllEntities(EntityTypes.GOOGLESEARCHES) espero que devuelva un objeto de tipo AllEntitiesModel.googleSearch
He intentado muchas cosas sin éxito. He revisado la documentación de TypeScript y no encontré nada como eso. Se agradece cualquier ayuda ;)
Respuesta #1
Necesitarás definir un parámetro de tipo genérico limitado a las claves permitidas:
declare function getAllEntities<T extends keyof AllEntitiesModel>(entityType: T): AllEntitiesModel[T]
Esto permite que Typescript reduzca el tipo de retorno según la clave proporcionada.
Parque infantil
Aquí usamos inferencia de argumentos de tipo, es decir, queremos que el compilador establezca el valor de
Tautomáticamente basándose en el tipo del argumento que pasamos
Así que, por ejemplo, en la llamada getAllEntities(EntityTypes.COPYPASTAS) el tipo de T será inferido como EntityTypes.COPYPASTAS (que es "copypastas") y el tipo de valor de retorno se resolverá como AllEntitiesModel["copypastas"].
