Skip to main content

จัดการ Runtime Type

เมื่อเราต้องจัดการกับชนิดข้อมูลในขณะรันโปรแกรม (Runtime Type) และไม่แน่ใจว่าจะได้รับค่าอะไรเข้ามา เช่น การเรียก API ต่าง ๆ ซึ่งเราสามารถใช้ Zod ในการตรวจสอบและกำหนด Schema ของข้อมูลในขณะรันโปรแกรม เพื่อให้ตรงตามที่เราต้องการ

กำหนด Schema ของข้อมูลที่ต้องการ ดังนี้:

import { z } from 'zod';

// นิยาม Schema ที่ต้องการ
export const responseBodySchema = z.object({
userId: z.number(),
id: z.number(),
title: z.string(),
completed: z.boolean(),
});

หลังจากที่เรานิยาม schema ไปแล้ว ให้ใช้คำสั่ง safeParse เพื่อตรวจสอบและแปลงข้อมูลในขณะรันโปรแกรม นำไปใช้งานในโค้ดได้เลย:

const url = 'https://jsonplaceholder.typicode.com/todos/1';
export async function getUserData() {
const rawBody = await (await fetch(url)).json();
// เอา data ที่เป็น any type ไป validate โดยใช้ zod schema
const parseBody = responseBodySchema.safeParse(rawBody);
if (!parseBody.success) {
const { error } = parseBody;
throw new Error(`Schema is not correct, ${JSON.stringify(error.errors)}`);
}

return parseBody.data;
// ^? { userId: number; id: number; title: string; completed: boolean; }
}

Zod เป็นพระเอกของเราในงานนี้เลย เพราะนอกจากจะเช็ค Schema ให้ตรงกับที่เราต้องการมั้ย

เราสามารถแปลงเป็น Type ของ TypeScript ให้เราไปทำอย่างอื่นได้ต่อ อีก ดีงามมากกกก 😍

type Todo = z.infer<typeof responseBodySchema>;
// ^? type Todo = { userId: number; id: number; title: string; completed: boolean; }

const myTodo: Todo = {
userId: 1,
id: 1,
title: 'delectus aut autem',
completed: false,
};

ใครไม่อยากใช้ zod เพียวๆ ก็มีคนทำ library เอาไว้ใช้

ลองเล่น Playground

สามารถดูตัวอย่างอื่นๆ ในการใช้ Zod ในชีวิตจริง