Digamos que tengo este código TypeScript:
enum EVENT { FIRST_EVENT = "game:first_encounter", } const EventHandler: keyof typeof EVENT = { [EVENT.FIRST_EVENT]: (data: any) => { console.log(`Hello there, ${data.blue_player}`); } } const data = { blue_player: 'Blue McBlue', event: EVENT.FIRST_EVENT} const eventName: EVENT = data.event; EventHandler[eventName](data); Tengo un error con EventHandler cerca de la parte superior.
Type '{ "game:first_encounter": (data: any) => void; }' is not assignable to type '"FIRST_EVENT"' También tengo un error con eventName en la última línea con:
Element implicitly has an 'any' type because index expression is not of type 'number'¿Ves lo que quiero decir? ¿Cómo puedo escribir esto correctamente?
Comencemos a escribir EventHandler y resolvamos esto.
En primer lugar, es un objeto:
type EventHandlerType = {};Tiene claves que son EVENTOS
// Create a mapped type mapping events to anything type EventHandlerType = { [e in EVENT]: any }Cada valor es una función que toma un parámetro de datos y devuelve vacío
// Create a mapped type mapping events to anything type EventHandlerType = { [e in EVENT]: (data: any) => void };Que debería funcionar en su código:
const EventHandler: { [key in EVENT]: (data: any) => void } = { [EVENT.FIRST_EVENT]: (data: any) => { console.log(`Hello there, ${data.blue_player}`); } } Esto se simplifica con el Record de tipo de utilidad incorporado que existe para estos casos:
const EventHandler: Record<EVENT, (data: any) => void> = { [EVENT.FIRST_EVENT]: (data: any) => { console.log(`Hello there, ${data.blue_player}`); } }Consulte los tipos asignados en los documentos para obtener más ejemplos y un desglose.