Skip to main content

Data Validation ด้วย Zod ใช้คู่กับ TypeScript ได้

หลายคนๆ อาจจะรู้จักกับ Zod ในการทำ Data Validation

TypeScript-first schema validation with static type inference

การเขียน Utility Function เพื่อทำ Data Validation

โดยใน Doc ของ zod พูดถึงการเขียน Function Generics สำหรับทำ Validation แต่ไม่ได้บอก Return Type ให้ เราสามารถใข้ z.infer<T> ได้เพื่อระบุ Type ของ Schema ได้

import { z, ZodFormattedError } from 'zod';

export function parseEnv<T extends z.ZodTypeAny>(schema: T, input: Record<string, string>): z.infer<T> {
const _functionEnv = schema.safeParse(input);

if (_functionEnv.success === false) {
const message = 'Invalid input';
throw new Error(zodPrettyError(message, _functionEnv.error.format()));
}

return { ..._functionEnv.data };
}

export const zodPrettyError = (message: string, errors: ZodFormattedError<Map<string, string>, string>) => {
const ouput = Object.entries(errors)
.map(([name, value]) => {
if (value && '_errors' in value) return `${name}: ${value._errors.join(', ')}\n`;
})
.filter(Boolean);

return `${message}:\n ${ouput.join(', ')}`;
};

//
// ตัวอย่างการใช้งาน
//

const appSchema = z.object({
Webhook_URL: z.string().url(),
Is_Enable: z.boolean(),
});

type App = t.infer<typeof appSchema>;
// จะได้ Type ของ TypeScript ออกมา
// type App = {
// Webhook_URL: string;
// Is_Enable: boolean;
// }

const appData: App = {
Webhook_URL: 'https://typescrip-th.thadaw.com',
Is_Enable: true,
}

// Validate it!
const parsingData = parseEnv(appSchema, data);

parsingData.Webhook_URL // type => string
parsingData.Is_Enable // type => boolean