0Pricing
TypeScript Academy · Урок

Типизация тестов и имитаций; 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 — локальная установка не требуется.

Все уроки этого курса

  1. Настройка Vitest/Jest для TS
  2. Типизация тестов и имитаций; expectTypeOf
  3. Обзор типизации E2E-тестов (Playwright/Cypress)
← Назад к TypeScript Academy