¿Para qué sirve el operador keyof de TypeScript?
El operador keyof tomas el tipo de objeto y produce un string o union literal numérica de sus propiedades.
type Coordenada = { x: number; y: number };
type P = keyof Coordenada;
// = tipo P es = a keyof Coordenada ('x' | 'y')
let a: P = "x";
let b: P = "y";
let c: P = "d"; // <- aqui se presenta un error porque "d" no es parte de los keys
En el anterior ejemplo el tipo
Coordenadatiene dos propiedadesxyy, por lo cualkeyof Coordenadaequivale a'x' | 'y'.
Si el tipo tiene un índice string o number, keyof retornará estos tipos como parte de la unión.
Si usamos keyof para referenciar a un Mapa entonces la unión de string | number.
type Mapa = { [k: string]: boolean };
type D = keyof Mapa;
// type de D = string | number
const i: D = 12;
const j: D = "hola";
Para los arreglos esto representa solo number, por lo que utilizar un string generará un error en el compilador.
type Arreglo = { [k: number]: unknown };
type B = keyof Arreglo;
// type de B = string
const x: B = 12;
const y: B = "hola"; // <- los arreglos no permiten índices tipo string