Типизация тестов и имитаций; expectTypeOf
Используйте expectTypeOf для статических проверок и типобезопасные имитации в Vitest/Jest, чтобы предотвращать хрупкие тесты.
«Типизация тестов и имитаций; expectTypeOf» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 3 уроков всего.
Введение
Цель: проверять типы с помощью expectTypeOf и писать типобезопасные моки, чтобы рефакторинг не нарушал тесты незаметно.
Основы expectTypeOf
expectTypeOf проверяет типы на этапе компиляции в Vitest: это не требует затрат во время выполнения, но помогает рано обнаруживать несоответствия.
// Vitest provides expectTypeOf
import { expectTypeOf } from "vitest";
function fullName(first: string, last: string) {
return `${first} ${last}`
}
// static checks (compile-time)
expectTypeOf(fullName).toBeFunction()
expectTypeOf(fullName("Ada","Lovelace")).toBeString()Расширенные проверки
Полезные приёмы: получение возвращаемых типов с помощью Awaited<ReturnType<...>>, а также сравнение литеральных типов и объединений.
import { expectTypeOf } from "vitest";
interface User { id: number; name: string }
function getUser(): Promise<User> { return Promise.resolve({ id:1, name:"A" }) }
// unwrap Promise
type Resolved = Awaited<ReturnType<typeof getUser>>
expectTypeOf<Resolved>().toMatchTypeOf<User>()
// literal + union
const status = "ok" as const
expectTypeOf(status).toEqualTypeOf<"ok">()Моки Vitest
Правильно типизируйте мок, передав сигнатуру в vi.fn; некорректные аргументы будут обнаружены при компиляции.
import { vi, describe, it, expect } from "vitest";
function fetchUser(id: number): Promise<string> {
return Promise.resolve(`user-${id}`)
}
// typed mock
const mockFetch: ReturnType<typeof vi.fn<[(id: number), Promise<string>]>> = vi.fn(async (id: number) => `user-${id}`)
it("uses typed mock", async () => {
const name = await mockFetch(5)
expect(name).toBe("user-5")
// mockFetch("x") // TS error: id must be number
})Моки Jest
В Jest зафиксируйте сигнатуру вызова, записав jest.fn<Signature>(); уточните тип мока с помощью MockedFunction.
import { jest } from "@jest/globals";
function times(a: number, b: number) { return a * b }
const mul = jest.fn<(a:number,b:number)=>number>((a,b)=>a*b)
mul(2,3) // ok
// mul("2",3) // TS error
// MockedFunction utility
type MulMock = jest.MockedFunction<typeof mul>
const _check: MulMock = mulСоветы
Отделяйте проверку значений (во время выполнения) от проверки типов (на этапе компиляции): это разные уровни.
// value assertions
import { expect } from "vitest";
expect(2 + 3).toBe(5)
// type assertions (compile-time)
import { expectTypeOf } from "vitest";
expectTypeOf(2 + 3).toBeNumber()
// don't confuse with runtime validators like zodВопрос
Быстрая проверка: что проверяет expectTypeOf во время запуска теста?
Повторение
Повторение: expectTypeOf — гарантия типов на этапе компиляции; vi.fn/jest.fn — типобезопасные моки с заданной сигнатурой.
Часто задаваемые вопросы
Урок «Типизация тестов и имитаций; expectTypeOf» бесплатный?
Да — полный текст урока «Типизация тестов и имитаций; expectTypeOf» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 3 уроков всего.
Чему я научусь в уроке «Типизация тестов и имитаций; expectTypeOf»?
Используйте expectTypeOf для статических проверок и типобезопасные имитации в Vitest/Jest, чтобы предотвращать хрупкие тесты. Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.
Сколько времени занимает урок «Типизация тестов и имитаций; expectTypeOf»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Настройка Vitest/Jest для TS
- Типизация тестов и имитаций; expectTypeOf
- Обзор типизации E2E-тестов (Playwright/Cypress)