如何通过Schema进行类型检测以让TypeScript正确识别类型?
使用Zod实现类型检测并让TypeScript正确识别
你已经通过Zod定义了Book的Schema,要实现一个能让TypeScript自动识别类型的检测函数,直接用Zod内置的safeParse方法配合类型谓词就能搞定。
步骤1:导出对应的TypeScript类型
先从Zod Schema里推导出自定义类型,避免手动重复编写:
import { z } from "zod"; export const Book = z.object({ type: z.literal("book"), title: z.string(), published: z.number().int() }); // 从Zod Schema推导TypeScript类型 export type Book = z.infer<typeof Book>;
步骤2:实现通用的isType检测函数
这个函数接收Zod Schema和待检测值,通过safeParse判断是否符合类型,同时用类型谓词告诉TypeScript检测成功后的类型:
function isType<T>(schema: z.ZodSchema<T>, value: unknown): value is T { const parseResult = schema.safeParse(value); return parseResult.success; }
步骤3:按你的需求使用
现在就能像你想要的那样使用,TypeScript会自动在if分支里推断something的类型为Book:
const something: unknown = { type: "book", title: "TypeScript实战", published: 2023 }; if (isType(Book, something)) { // 这里TypeScript能正确识别something是Book类型,直接访问title等属性不会报错 console.log(`The book title was '${something.title}'`); }
补充说明
safeParse不会像parse那样抛出错误,而是返回一个包含success字段的结果对象,适合做条件判断。- 类型谓词
value is T是核心,它让TypeScript知道:当函数返回true时,传入的value就是T类型,从而在后续代码中提供正确的类型提示和检查。
内容的提问来源于stack exchange,提问作者GregRos
相关产品推荐
相关产品推荐

