TypeScript Academy · 课时

从模式推断类型

直接从 Zod 模式推导静态类型。

第 2 / 4 课13 个步骤

从模式推断类型 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

模式携带类型信息

Zod 模式知道自己验证的 TypeScript 类型。z.infer 可以提取该类型,因此您只需编写一次结构。

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
// User is { name: string; age: number }

z.infer 工具

z.infer<typeof schema> 会生成该模式所验证的静态类型。请注意其中的 typeof:您传入的是模式值。

import { z } from "zod";
const tagSchema = z.array(z.string());
type Tags = z.infer<typeof tagSchema>; // string[]

单一事实来源

如果没有类型推断,您就必须分别维护一个类型和一个模式,两者可能逐渐不一致。z.infer 会让它们始终完全同步。

import { z } from "zod";
const schema = z.object({ id: z.number(), email: z.string() });
type Account = z.infer<typeof schema>;
// Change the schema, the type updates automatically.

推断嵌套类型

类型推断可以处理嵌套对象和数组,从一个模式生成完整的嵌套 TypeScript 类型。

import { z } from "zod";
const postSchema = z.object({
  title: z.string(),
  author: z.object({ name: z.string() }),
  tags: z.array(z.string())
});
type Post = z.infer<typeof postSchema>;
// Post.author.name is string

使用推断出的类型

在任何可以使用手写类型的地方,都可以使用推断出的类型:函数参数、变量和返回类型。

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
function greet(u: User): string {
  return "Hi " + u.name;
}

parse 返回推断出的类型

schema.parse 返回的值已经具有推断出的类型,因此后续代码可以获得完整的类型信息。

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
const raw: unknown = { name: "Ada", age: 36 };
const user: User = userSchema.parse(raw); // typed and validated

类型中的可选和可空

模式修饰符会反映到推断出的类型中。使用 .optional() 的字段在 TypeScript 中也会变为可选字段。

import { z } from "zod";
const schema = z.object({
  name: z.string(),
  nickname: z.string().optional()
});
type P = z.infer<typeof schema>;
// P is { name: string; nickname?: string }

从对象数组中进行推断

组合使用 z.array 和 z.object 后,推断出的类型就是对象类型的数组。

import { z } from "zod";
const usersSchema = z.array(z.object({ id: z.number() }));
type Users = z.infer<typeof usersSchema>;
// Users is { id: number }[]

为什么需要 typeof

模式是一个值,因此在将它传给 z.infer 之前,需要使用 typeof schema 引用它的类型。

import { z } from "zod";
const s = z.string();
type S = z.infer<typeof s>; // string
// z.infer<s> would be wrong: s is a value, not a type.

跨模块边界进行类型推断

同时导出模式及其推断出的类型,这样其他模块就能验证并一致地使用相同结构。

import { z } from "zod";
export const userSchema = z.object({ name: z.string() });
export type User = z.infer<typeof userSchema>;
// Consumers import both the runtime schema and the type.

一个定义,两个世界

模式负责运行时验证;z.infer 负责编译时类型检查。一个声明即可同时支持两者,消除重复定义。

import { z } from "zod";
const configSchema = z.object({ port: z.number(), host: z.string() });
type Config = z.infer<typeof configSchema>;
// Validate at runtime, type at compile time, no drift.

快速检查:推断类型

测试您从模式推断类型的理解。

回顾:从模式推断类型

您学会了如何通过 z.infer<typeof schema> 从 Zod 模式推导 TypeScript 类型,为验证和类型提供单一事实来源,其中也包括嵌套、可选和数组结构。

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
// User stays in sync with the schema automatically.
免费开始

用 AI 导师学习 TypeScript — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
101
课程
352

常见问题解答

「从模式推断类型」课时是免费的吗?

是的 — 「从模式推断类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「从模式推断类型」这节课中我会学到什么?

直接从 Zod 模式推导静态类型。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「从模式推断类型」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Zod 模式基础
  2. 从模式推断类型
  3. parse 与 safeParse
  4. 组合与细化模式
← 返回 TypeScript Academy