Tech TutorBangla Web Documentation
Portfolio
HomeHTMLCSSTailwind CSSJavaScriptTypeScriptReactNext.jsNode.jsExpressSocket.IOExpoWordPressPostgreSQLPrismaPostgresNestJSMongoDBDockerTanStackTanStack TableRTK QueryGitGitHub
  • TanStack Documentation42টি অধ্যায়
প্রযুক্তি নির্বাচন
HomeHTMLCSSTailwind CSSJavaScriptTypeScriptReactNext.jsNode.jsExpressSocket.IOExpoWordPressPostgreSQLPrismaPostgresNestJSMongoDBDockerTanStackTanStack TableRTK QueryGitGitHub
  • Project Overview
  • Architecture
  • Folder Structure
  • Setup Next.js
  • Axios Setup
  • API Client
  • API Types
  • Query Install
  • Query Provider
  • Query Keys
  • Data Fetching
  • States
  • Devtools
  • Create Mutation
  • Update Mutation
  • Delete Mutation
  • Cache Invalidation
  • Optimistic Update
  • Pagination
  • Search
  • Filtering
  • Sorting
  • TanStack Table
  • Table Explore
  • Table Columns
  • Table Actions
  • React Hook Form
  • Zod Validation
  • Create Form
  • Edit Form
  • Dialog Modal
  • Delete Confirmation
  • Complete CRUD Flow
  • Full Integration
  • Error Handling
  • Loading States
  • Reusable Components
  • Production
  • Complete Project
  • Common Mistakes
  • Best Practices
  • Interview Q&A
  1. Docs
  2. TanStack
  3. Zod Schema — Validation
TanStackIntermediate

Zod Schema — Validation

zod v4-এ product schema, coerce, partial update ও error message — বাংলায়।

7টি অংশবাংলা ভাষায়

zodResolver দিয়ে RHF-কে আঙ্গুলে zest schema-এর ভিত্তিতে validate করে। schema টাইপ → CreateProductInput-এর উৎস। Zod 4 ব্যবহার করছি (project-এ zod: ^4)।

src/lib/validators/product-schema.tsts
ts
import { z } from "zod";

export const categorySchema = z.enum([
  "electronics",
  "clothing",
  "books",
  "food",
]);

export const productSchema = z.object({
  name: z.string().min(1, "নাম আবশ্যক").max(80),
  description: z.string().max(500).optional(),
  // form থেকে আসা string → number
  price: z.coerce.number()
    .finite("সঠিক দাম দিন")
    .min(1, "দাম ১-এর বেশি হওয়া উচিত"),
  category: categorySchema,
  stock: z.coerce.number().int().min(0, "Stock ঋণাত্মক নয়"),
  status: z.enum(["active", "inactive"]),
});

export type CreateProductInput = z.infer<typeof productSchema>;

// edit-এ সব field বাধ্যতামূলক নয় চাইলে
export const updateProductSchema = productSchema.partial();
export type UpdateProductInput = z.infer<typeof updateProductSchema>;

z.enum + category types

z.enum([...]) থেকে আমরা type derive করি — যেন category ভুল টাইপ compile-time-এই আটকায়। এভাবে API types ও form schema একটাই সত্যের উৎস (single source).

zodResolver যুক্ত করা

Resolver-সহ useFormtsx
tsx
import { zodResolver } from "@hookform/resolvers/zod";
import { productSchema } from "@/lib/validators/product-schema";

useForm<CreateProductInput>({
  resolver: zodResolver(productSchema),
  defaultValues: {
    name: "",
    description: "",
    price: 0,
    category: "electronics",
    stock: 0,
    status: "active",
  },
});
coerce কেন

HTML type="number" input-এর concern string — কিন্তু আমরা চাই number। z.coerce.number() আগে শুধু string-কে number-এ রূপান্তর করে, তারপর validate করে। ছাড়া হলে type mismatch-এ resolver quarterback হতো।

শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।
আগেরReact Hook Form — SetupপরেরCreate Form — Full
এই পেজে
Tech Tutor

বাংলায় ওয়েব ডেভেলপমেন্ট ডকুমেন্টেশন শিখুন — ধাপে ধাপে।

Homeসব ডকুমেন্টেশনQuick Startআমার নোটস

© 2026 Tech Tutor. বাংলায় শিখুন, বাংলায় গড়ুন।

mdanamolhasan1998@gmail.com