У позиції типу typeof повертає тип значення (а не рядок 'object', як у JavaScript під час виконання):
const config = {
apiUrl: '/api',
retries: 3,
features: { chat: true },
};
type Config = typeof config;
// { apiUrl: string; retries: number; features: { chat: boolean } }
Навіщо: значення стає джерелом правди, а тип - похідним. Додали поле в об'єкт - тип оновився сам, дублювати опис не треба.
Типові застосування:
1. Тип функції чи її частин:
function createUser(name: string, role: 'admin' | 'editor') {
return { id: crypto.randomUUID(), name, role, createdAt: new Date() };
}
type User = ReturnType<typeof createUser>;
type CreateUserArgs = Parameters<typeof createUser>;
2. Перелік значень з масиву чи об'єкта:
const ROLES = ['admin', 'editor', 'viewer'] as const;
type Role = (typeof ROLES)[number]; // 'admin' | 'editor' | 'viewer'
const STATUS = { draft: 'Чернетка', published: 'Опубліковано' } as const;
type StatusKey = keyof typeof STATUS; // 'draft' | 'published'
3. Тип схеми валідації: z.infer<typeof userSchema> - тип з об'єкта Zod.
4. Тип модуля чи класу: typeof import('./api'), typeof User (конструктор, а не екземпляр).
Обмеження:
typeofу позиції типу приймає лише ідентифікатор чи доступ до властивості (typeof config.features), але не довільний вираз:typeof fn()- помилка. Для результату виклику -ReturnType<typeof fn>;- розширення типів: без
as constрядки й числа в об'єкті виводяться якstring,number. Якщо потрібні точні літерали -as const.
Обидва typeof в одному рядку:
if (typeof value === 'string') {} // typeof JavaScript - перевірка під час виконання
type T = typeof value; // typeof TypeScript - тип під час компіляції
Це різні оператори з однаковою назвою: перший працює в коді, другий - лише в позиції типу.