🧱 Суть
typeof в TypeScript позволяет получить тип уже существующей переменной или объекта, чтобы не описывать этот тип вручную.
Он берёт структуру значения и превращает её в тип.
📦 Проблема
Часто бывает ситуация:
const user = {
name: 'Евгений',
age: 30,
};Чтобы создать такой же тип вручную, пришлось бы писать:
type User = {
name: string;
age: number;
};Проблема:
- появляется дублирование
- при изменении объекта нужно менять тип вручную
✅ Решение
Использовать typeof:
const user = {
name: 'Евгений',
age: 30,
};
type User = typeof user;Теперь TypeScript сам создаёт тип:
{
name: string;
age: number;
}💻 Код
Переиспользование типа объекта
const config = {
theme: 'dark',
lang: 'ru',
};
function setup(options: typeof config) {
// options имеет тип config
}Теперь если изменить:
const config = {
theme: 'dark',
lang: 'ru',
version: 1,
};тип функции тоже обновится автоматически.
Получение ключей объекта через keyof
Есть объект:
const status = {
success: '🟢',
error: '🔴',
pending: '🟡',
};Получаем его ключи:
type StatusKey = keyof typeof status;Результат:
'success' | 'error' | 'pending'Создание типа из массива
Например:
const roles = ['admin', 'user', 'guest'] as const;Получаем тип:
type Role = typeof roles[number];Результат:
'admin' | 'user' | 'guest'Получение типов аргументов функции
Например:
function showUser(user: {
name: string;
age: number;
}) {}Можно получить тип аргумента:
type User = Parameters<typeof showUser>[0];Теперь:
Userэто:
{
name: string;
age: number;
}Что typeof НЕ делает
typeof в TypeScript отличается от JavaScript.
В JavaScript:
typeof 5вернёт:
"number"Это проверка значения во время выполнения.
В TypeScript:
type User = typeof user;это работа только с типами.
Он:
- ❌ не получает значение
- ❌ не выполняется в браузере
- ✅ работает только во время проверки TypeScript
Простая аналогия
Представь готовую таблицу:
User
name | age
------------
Bob | 25
typeof user говорит: “Возьми структуру этой таблицы и сделай из неё шаблон”
Главное отличие
typeof
type User = typeof user;Получает всю структуру объекта:
{
name: string;
age: number;
}
keyof typeof
type UserKeys = keyof typeof user;Получает только ключи:
'name' | 'age'Пример
Объект:
const fruits = {
apple: {
color: 'red',
},
banana: {
color: 'yellow',
},
grape: {
color: 'purple',
},
};typeof fruits
type FruitsType = typeof fruits;Результат:
{
apple: {
color: string;
};
banana: {
color: string;
};
grape: {
color: string;
};
}Получаем всю структуру объекта.
keyof typeof fruits
type FruitName = keyof typeof fruits;Результат:
'apple' | 'banana' | 'grape'Получаем только названия ключей.
🎯 Вывод
typeof obj→ берёт тип всей структуры объектаkeyof typeof obj→ берёт только ключи объектаtypeofпомогает не дублировать типы вручную- особенно полезен для:
- конфигураций
- объектов
variants - словарей
- констант
- типизации API-ответов