obj는 값이라서 타입 자리에 바로 쓸 수 없습니다. 그래서 typeof 연산자를 붙여 타입으로 만들었습니다. Keys 타입에는 obj의 속성 키 타입이 들어 있습니다. typeof obj가 객체 타입이고, Keys가 키의 타입이므로 Values는 값의 타입이 됩니다.
keyof의 특성을 몇 가지만 더 확인해봅시다.
type Keys = keyof any;
// type Keys = string | number | symbol
type ArrayKeys = keyof [1, 2, 3];
let a: ArrayKeys = 'lastIndexOf';
a = 'length';
a = '2';
a = '3';
// Type '"3"' is not assignable to type 'keyof [1, 2, 3]'.
a = 3;
먼저 keyof any는 string | number | symbol입니다. 객체의 키는 string과 symbol만 되는 것이 원칙이나 타입스크립트에서는 배열을 위해 number 타입의 키를 허용합니다.