Перейти к содержимому

keyof / typeof

Тройка операторов уровня типов. keyof T — union ключей, typeof v — тип значения, T[K] — индексный доступ. На интервью просят написать type-safe get(obj, key) и получить тип из runtime-объекта (например, из as const словаря).

Связка из трёх:

const ROUTES = {
home: '/',
about: '/about',
user: '/u/:id',
} as const;
// 1) typeof — тип значения
type Routes = typeof ROUTES;
// 2) keyof — union ключей
type Key = keyof Routes; // 'home' | 'about' | 'user'
// 3) indexed access — тип значения по ключу
type HomePath = Routes['home']; // '/'
function go<K extends Key>(k: K): Routes[K] { return ROUTES[k]; }
const a = go('home'); // '/' (literal)

keyof у индексных типов даёт string/number:

type Dict = { [k: string]: number };
type K1 = keyof Dict; // string | number (number потому что 'a'->'a'== 'a' ключ)
type Arr = number[];
type K2 = keyof Arr; // number | 'length' | 'push' | ...

Итог: keyof typeof obj + indexed access = «вытащить тип из существующего рантайм-значения».