¿Cómo defino un diccionario de número a cadena en Typescript?
Estoy jugando con TypeScript y convirtiendo una pequeña biblioteca de Javascript a él. En una parte del código había un mapeo definido estáticamente de nombre de tecla amigable a su código de tecla. El código original se veía así:
keys: { "Backspace": 8, "Tab": 9, "Enter": 13, ....etc.. };
Definí esto en TypeScript mediante:
static keys: { [name: string]: number; } = { "Backspace": 8, "Tab": 9, "Enter": 13, ... etc.. };
Esto parece funcionar bien, sin embargo otra parte del código utiliza el mapeo opuesto:
chars: {8:"Backspace",9:"Tab",13:"Enter", ...etc... };
Así que intenté hacer el mismo tipo de definición en TypeScript que hice anteriormente:
chars: { [code: number]: string; } = { 8: "Backspace", 9: "Tab", 13: "Enter", ...etc.. };
Esto no compila con el siguiente error:
No se puede convertir '{ 0: string; 1: string; 2: string; 4: string; 8: string; 9: string; : string; }' a '{ [name: number]: string; }': Las firmas de índice de los tipos '{ 0: string; 1: string; 2: string; 4: string; 8: string; 9: string; : string; }' y '{ [name: number]: string; }' son incompatibles
¿Cómo defino este mapeo en Typescript?
Respuesta #1
El problema es que en JavaScript - y por lo tanto en TypeScript - las claves de un literal de objeto siempre son cadenas, y por lo tanto no se puede asignar a una variable con un indexador numérico.
Un objeto con un indexador numérico es un arreglo, por lo que tienes que hacer esto:
var chars: string[] = [];
chars[8]= "Backspace";
chars[9]= "Tab";
chars[13] = "Enter";
