Type Manipulation, operador keyof

¿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 Coordenada tiene dos propiedades x y y, por lo cual keyof Coordenada equivale 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