测试与模拟的类型;expectTypeOf
使用 expectTypeOf 进行静态检查,并在 Vitest/Jest 中使用类型安全的模拟对象,避免测试脆弱。
测试与模拟的类型;expectTypeOf 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 3 节课。
「测试与模拟的类型;expectTypeOf」这节课中我会学到什么?
使用 expectTypeOf 进行静态检查,并在 Vitest/Jest 中使用类型安全的模拟对象,避免测试脆弱。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。
「测试与模拟的类型;expectTypeOf」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 为 TS 配置 Vitest/Jest
- 测试与模拟的类型;expectTypeOf
- 端到端类型概览(Playwright/Cypress)