{"id":9918,"date":"2026-07-06T12:21:49","date_gmt":"2026-07-06T03:21:49","guid":{"rendered":"https:\/\/fastcoding.jp\/blog\/?p=9918"},"modified":"2026-07-06T12:21:57","modified_gmt":"2026-07-06T03:21:57","slug":"ai-driven-form-validation","status":"publish","type":"post","link":"https:\/\/fastcoding.jp\/blog\/ai-driven-development\/ai-driven-form-validation\/","title":{"rendered":"React Hook Form + Zod \u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092AI\u99c6\u52d5\u3067\u5b9f\u88c5\u3059\u308b \u2500 AI\u304c\u5f97\u610f\u306a\u90e8\u5206\u3068\u4eba\u9593\u304c\u5224\u65ad\u3059\u3079\u304d\u90e8\u5206"},"content":{"rendered":"<div class=\"the_content\"><p class=\"wp-block-paragraph\">\u682a\u5f0f\u4f1a\u793e\u30d5\u30a1\u30b9\u30c8\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u30d5\u30eb\u30b9\u30bf\u30c3\u30af\u30a8\u30f3\u30b8\u30cb\u30a2 MrFire\u3067\u3059\u3002<\/p>\n\n<p class=\"wp-block-paragraph\">\u5148\u65e5\u3001\u30d0\u30a4\u30af\u306e\u8eca\u691c\u3092\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u4e88\u7d04\u3057\u3088\u3046\u3068\u3057\u305f\u3089\u3001\u30d5\u30a9\u30fc\u30e0\u306e\u5165\u529b\u9805\u76ee\u304c20\u500b\u4ee5\u4e0a\u3042\u308a\u307e\u3057\u305f\u3002\u3057\u304b\u3082\u9014\u4e2d\u3067\u300c\u8eca\u691c\u8a3c\u306e\u6709\u52b9\u671f\u9650\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u300d\u3068\u8a00\u308f\u308c\u3001\u624b\u5143\u306b\u8eca\u691c\u8a3c\u304c\u306a\u304f\u3066\u65ad\u5ff5\u3002\u30d5\u30a9\u30fc\u30e0\u306e\u8a2d\u8a08\u3063\u3066\u3001\u4f5c\u308b\u5074\u3082\u4f7f\u3046\u5074\u3082\u5927\u5909\u3067\u3059\u3002<\/p>\n\n<p class=\"wp-block-paragraph\"><em>\u30d5\u30a9\u30fc\u30e0\u5b9f\u88c5\u306e\u4f9d\u983c\u304c\u6765\u308b\u305f\u3073\u306b\u300c\u307e\u305f\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u304b\u2026\u300d\u3068\u601d\u3046\u306e\u306f\u79c1\u3060\u3051\u3067\u306f\u306a\u3044\u306f\u305a\u3002<\/em><\/p>\n\n<p class=\"wp-block-paragraph\">\u6700\u8fd1\u306e\u6848\u4ef6\u3067\u3001\u554f\u3044\u5408\u308f\u305b\u30d5\u30a9\u30fc\u30e0\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092AI\u99c6\u52d5\u3067\u5b9f\u88c5\u3057\u307e\u3057\u305f\u3002React Hook Form + Zod \u3068\u3044\u3046\u7d44\u307f\u5408\u308f\u305b\u3067\u3001AI\u306b\u30b9\u30ad\u30fc\u30de\u5b9a\u7fa9\u304b\u3089\u30d5\u30a9\u30fc\u30e0\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u307e\u3067\u4e00\u6c17\u306b\u66f8\u304b\u305b\u3066\u307f\u305f\u3068\u3053\u308d\u3001\u57fa\u672c\u7684\u306a\u578b\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306f\u6b63\u78ba\u306b\u51fa\u3066\u304f\u308b\u4e00\u65b9\u3001\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u56fa\u6709\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3067\u306fAI\u306e\u51fa\u529b\u3092\u304b\u306a\u308a\u4fee\u6b63\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3057\u305f\u3002<\/p>\n\n<p class=\"wp-block-paragraph\">\u4eca\u56de\u306f\u3001AI\u304c\u5f97\u610f\u306a\u90e8\u5206\u3068\u4eba\u9593\u306e\u5224\u65ad\u304c\u5fc5\u8981\u306a\u90e8\u5206\u3092\u3001Before\/After\u306e\u30b3\u30fc\u30c9\u6bd4\u8f03\u3067\u6574\u7406\u3057\u307e\u3059\u3002<\/p>\n\n<h2 class=\"wp-block-heading\">React Hook Form + Zod \u306e\u57fa\u672c\u69cb\u6210<\/h2>\n\n<p class=\"wp-block-paragraph\">\u307e\u305a\u524d\u63d0\u3068\u3057\u3066\u3001React Hook Form \u3068 Zod \u306e\u5f79\u5272\u3092\u6574\u7406\u3057\u307e\u3059\u3002<\/p>\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30e9\u30a4\u30d6\u30e9\u30ea<\/th><th>\u5f79\u5272<\/th><\/tr><\/thead><tbody><tr><td>React Hook Form<\/td><td>\u30d5\u30a9\u30fc\u30e0\u306e\u72b6\u614b\u7ba1\u7406\u3001\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c\u30bf\u30a4\u30df\u30f3\u30b0\u5236\u5fa1\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/td><\/tr><tr><td>Zod<\/td><td>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30eb\u30fc\u30eb\u306e\u5b9a\u7fa9\uff08\u30b9\u30ad\u30fc\u30de\uff09\u3001\u578b\u63a8\u8ad6<\/td><\/tr><tr><td>@hookform\/resolvers<\/td><td>React Hook Form \u3068 Zod \u3092\u63a5\u7d9a\u3059\u308b\u30a2\u30c0\u30d7\u30bf\u30fc<\/td><\/tr><\/tbody><\/table><\/figure>\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u7d44\u307f\u5408\u308f\u305b\u306e\u5229\u70b9\u306f\u3001Zod\u30b9\u30ad\u30fc\u30de\u3092\u5b9a\u7fa9\u3059\u308c\u3070TypeScript\u306e\u578b\u3068\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30eb\u30fc\u30eb\u304c\u4e00\u7b87\u6240\u306b\u307e\u3068\u307e\u308b\u3053\u3068\u3067\u3059\u3002AI\u306b\u3068\u3063\u3066\u3082\u3001\u30b9\u30ad\u30fc\u30de\u3068\u3044\u3046\u660e\u78ba\u306a\u69cb\u9020\u304c\u3042\u308b\u304a\u304b\u3052\u3067\u6b63\u78ba\u306a\u30b3\u30fc\u30c9\u3092\u51fa\u3057\u3084\u3059\u3044\u9818\u57df\u3067\u3059\u3002<\/p>\n\n<h2 class=\"wp-block-heading\">AI\u304c\u5f97\u610f\u306a\u90e8\u5206\uff1a\u57fa\u672c\u30b9\u30ad\u30fc\u30de\u306e\u751f\u6210<\/h2>\n\n<p class=\"wp-block-paragraph\">\u307e\u305a\u3001AI\u306b\u300c\u554f\u3044\u5408\u308f\u305b\u30d5\u30a9\u30fc\u30e0\u306eZod\u30b9\u30ad\u30fc\u30de\u3092\u66f8\u3044\u3066\u300d\u3068\u4f9d\u983c\u3057\u305f\u7d50\u679c\u3067\u3059\u3002<\/p>\n\n<pre class=\"wp-block-code\"><code>import { z } from 'zod';\n\nexport const contactSchema = z.object({\n  companyName: z\n    .string()\n    .min(1, '\u4f1a\u793e\u540d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044'),\n  name: z\n    .string()\n    .min(1, '\u304a\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044'),\n  email: z\n    .string()\n    .min(1, '\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044')\n    .email('\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093'),\n  phone: z\n    .string()\n    .regex(\/^0\\d{9,10}$\/, '\u96fb\u8a71\u756a\u53f7\u306e\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093')\n    .optional()\n    .or(z.literal('')),\n  inquiryType: z\n    .enum(['\u898b\u7a4d\u3082\u308a\u4f9d\u983c', '\u30b5\u30fc\u30d3\u30b9\u306b\u3064\u3044\u3066', '\u63a1\u7528\u306b\u3064\u3044\u3066', '\u305d\u306e\u4ed6'], {\n      errorMap: () =&gt; ({ message: '\u304a\u554f\u3044\u5408\u308f\u305b\u7a2e\u5225\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044' }),\n    }),\n  message: z\n    .string()\n    .min(10, '\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9\u306f10\u6587\u5b57\u4ee5\u4e0a\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044')\n    .max(1000, '\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9\u306f1000\u6587\u5b57\u4ee5\u5185\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044'),\n});\n\nexport type ContactFormData = z.infer&lt;typeof contactSchema&gt;;<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u306f\u6b63\u78ba\u3067\u3059\u3002\u57fa\u672c\u7684\u306a\u578b\u30c1\u30a7\u30c3\u30af\uff08string\u3001email\u5f62\u5f0f\u3001\u6b63\u898f\u8868\u73fe\u3001enum\u3001min\/max\uff09\u306fAI\u304c\u5f97\u610f\u3068\u3059\u308b\u9818\u57df\u3067\u3001\u307b\u307c\u4fee\u6b63\u306a\u3057\u3067\u4f7f\u3048\u307e\u3057\u305f\u3002<code>z.infer<\/code>\u306b\u3088\u308b\u578b\u63a8\u8ad6\u3082\u6b63\u3057\u3044\u3002<\/p>\n\n<h2 class=\"wp-block-heading\">AI\u304c\u82e6\u624b\u306a\u90e8\u5206\uff1a\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/h2>\n\n<p class=\"wp-block-paragraph\">\u554f\u984c\u306f\u3053\u3053\u304b\u3089\u3067\u3059\u3002\u5b9f\u969b\u306e\u6848\u4ef6\u3067\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u8981\u4ef6\u304c\u3042\u308a\u307e\u3057\u305f\u3002<\/p>\n\n<ul class=\"wp-block-list\"><li>\u300c\u304a\u554f\u3044\u5408\u308f\u305b\u7a2e\u5225\u300d\u304c\u300c\u898b\u7a4d\u3082\u308a\u4f9d\u983c\u300d\u306e\u5834\u5408\u306f\u300c\u96fb\u8a71\u756a\u53f7\u300d\u3092\u5fc5\u9808\u306b\u3059\u308b<\/li><li>\u300c\u304a\u554f\u3044\u5408\u308f\u305b\u7a2e\u5225\u300d\u304c\u300c\u63a1\u7528\u306b\u3064\u3044\u3066\u300d\u306e\u5834\u5408\u306f\u300c\u4f1a\u793e\u540d\u300d\u3092\u4efb\u610f\u306b\u3059\u308b<\/li><li>\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u78ba\u8a8d\u5165\u529b\u6b04\u3092\u8ffd\u52a0\u3057\u3001\u4e00\u81f4\u30c1\u30a7\u30c3\u30af\u3092\u884c\u3046<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u3092AI\u306b\u8ffd\u52a0\u3067\u4f9d\u983c\u3057\u305f\u3068\u3053\u308d\u3001\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u304c\u8fd4\u3063\u3066\u304d\u307e\u3057\u305f\u3002<\/p>\n\n<h3 class=\"wp-block-heading\">Bad Case\uff1aAI\u304c\u51fa\u3057\u305f\u6761\u4ef6\u4ed8\u304d\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/h3>\n\n<pre class=\"wp-block-code\"><code>\/\/ AI\u304c\u51fa\u3057\u305f\u6761\u4ef6\u4ed8\u304d\u5fc5\u9808\u306e\u30b3\u30fc\u30c9\uff08\u554f\u984c\u3042\u308a\uff09\nexport const contactSchema = z.object({\n  companyName: z\n    .string()\n    .min(1, '\u4f1a\u793e\u540d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044'),\n  name: z\n    .string()\n    .min(1, '\u304a\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044'),\n  email: z\n    .string()\n    .email('\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093'),\n  emailConfirm: z\n    .string()\n    .email('\u78ba\u8a8d\u7528\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093'),\n  phone: z\n    .string()\n    .regex(\/^0\\d{9,10}$\/, '\u96fb\u8a71\u756a\u53f7\u306e\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093')\n    .optional(),\n  inquiryType: z\n    .enum(['\u898b\u7a4d\u3082\u308a\u4f9d\u983c', '\u30b5\u30fc\u30d3\u30b9\u306b\u3064\u3044\u3066', '\u63a1\u7528\u306b\u3064\u3044\u3066', '\u305d\u306e\u4ed6']),\n  message: z\n    .string()\n    .min(10, '\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9\u306f10\u6587\u5b57\u4ee5\u4e0a\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044'),\n}).refine((data) =&gt; data.email === data.emailConfirm, {\n  message: '\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u4e00\u81f4\u3057\u307e\u305b\u3093',\n  path: ['emailConfirm'],\n}).refine((data) =&gt; {\n  if (data.inquiryType === '\u898b\u7a4d\u3082\u308a\u4f9d\u983c') {\n    return data.phone !== undefined &amp;&amp; data.phone !== '';\n  }\n  return true;\n}, {\n  message: '\u898b\u7a4d\u3082\u308a\u4f9d\u983c\u306e\u5834\u5408\u306f\u96fb\u8a71\u756a\u53f7\u304c\u5fc5\u9808\u3067\u3059',\n  path: ['phone'],\n});<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">\u4e00\u898b\u52d5\u304d\u305d\u3046\u3067\u3059\u304c\u30013\u3064\u306e\u554f\u984c\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>\u554f\u984c1\uff1a<code>.refine()<\/code>\u306e\u9023\u9396\u3067\u306f1\u3064\u306erefine\u306b\u3064\u304d1\u3064\u306e\u30a8\u30e9\u30fc\u3057\u304b\u51fa\u305b\u306a\u3044<\/strong><\/p>\n\n<p class=\"wp-block-paragraph\"><code>.refine()<\/code>\u306f1\u56de\u306e\u547c\u3073\u51fa\u3057\u30671\u3064\u306e\u30a8\u30e9\u30fc\u3057\u304b\u751f\u6210\u3067\u304d\u307e\u305b\u3093\u3002\u8907\u6570\u306e\u76f8\u95a2\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092<code>.refine()<\/code>\u306e\u9023\u9396\u3067\u66f8\u304f\u3068\u3001\u305d\u308c\u305e\u308c\u304c\u72ec\u7acb\u3057\u305f<code>ZodEffects<\/code>\u30e9\u30c3\u30d1\u30fc\u306b\u306a\u308a\u3001\u30b3\u30fc\u30c9\u306e\u898b\u901a\u3057\u304c\u60aa\u304f\u306a\u308a\u307e\u3059\u3002\u307e\u305f\u30011\u3064\u306e<code>.refine()<\/code>\u3067\u8907\u6570\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u540c\u6642\u306b\u30a8\u30e9\u30fc\u3092\u4ed8\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u306a\u3044\u305f\u3081\u3001\u300c\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u4e0d\u4e00\u81f4\u300d\u3068\u300c\u96fb\u8a71\u756a\u53f7\u306e\u5fc5\u9808\u30c1\u30a7\u30c3\u30af\u300d\u30921\u3064\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u95a2\u6570\u5185\u3067\u307e\u3068\u3081\u3066\u51e6\u7406\u3067\u304d\u307e\u305b\u3093\u3002<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>\u554f\u984c2\uff1a\u300c\u63a1\u7528\u306b\u3064\u3044\u3066\u300d\u306e\u3068\u304d\u306b\u4f1a\u793e\u540d\u3092\u4efb\u610f\u306b\u3059\u308b\u30ed\u30b8\u30c3\u30af\u304c\u306a\u3044<\/strong><\/p>\n\n<p class=\"wp-block-paragraph\">AI\u306e\u51fa\u529b\u306b\u306f\u3053\u306e\u8981\u4ef6\u304c\u53cd\u6620\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30d7\u30ed\u30f3\u30d7\u30c8\u306b\u542b\u3081\u305f\u306e\u3067\u3059\u304c\u30013\u3064\u76ee\u306e\u8981\u4ef6\u3068\u3057\u3066\u512a\u5148\u5ea6\u304c\u4e0b\u304c\u3063\u305f\u306e\u304b\u3001\u7121\u8996\u3055\u308c\u3066\u3044\u307e\u3057\u305f\u3002<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>\u554f\u984c3\uff1a\u7a7a\u6587\u5b57\u306ephone\u306b\u5bfe\u3059\u308b<code>.optional()<\/code>\u306e\u6271\u3044<\/strong><\/p>\n\n<p class=\"wp-block-paragraph\">HTML\u306einput\u8981\u7d20\u306f\u672a\u5165\u529b\u3067\u3082\u7a7a\u6587\u5b57<code>\"\"<\/code>\u3092\u8fd4\u3057\u307e\u3059\u3002Zod\u306e<code>.optional()<\/code>\u306f<code>undefined<\/code>\u3092\u8a31\u53ef\u3057\u307e\u3059\u304c\u3001\u7a7a\u6587\u5b57\u306f\u8a31\u53ef\u3057\u307e\u305b\u3093\u3002AI\u306f\u7a7a\u6587\u5b57\u5217\u306e\u30b1\u30fc\u30b9\u3092\u8003\u616e\u3057\u3066\u3044\u307e\u305b\u3093\u3067\u3057\u305f\u3002<\/p>\n\n<h3 class=\"wp-block-heading\">Good Case\uff1a\u4eba\u9593\u304c\u4fee\u6b63\u3057\u305f\u6700\u7d42\u7248<\/h3>\n\n<pre class=\"wp-block-code\"><code>import { z } from 'zod';\n\nconst phoneRegex = \/^0\\d{9,10}$\/;\n\nexport const contactSchema = z\n  .object({\n    companyName: z.string().optional().default(''),\n    name: z\n      .string()\n      .min(1, '\u304a\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044'),\n    email: z\n      .string()\n      .min(1, '\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044')\n      .email('\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093'),\n    emailConfirm: z\n      .string()\n      .min(1, '\u78ba\u8a8d\u7528\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044'),\n    phone: z\n      .string()\n      .optional()\n      .default(''),\n    inquiryType: z\n      .enum(['\u898b\u7a4d\u3082\u308a\u4f9d\u983c', '\u30b5\u30fc\u30d3\u30b9\u306b\u3064\u3044\u3066', '\u63a1\u7528\u306b\u3064\u3044\u3066', '\u305d\u306e\u4ed6'], {\n        errorMap: () =&gt; ({ message: '\u304a\u554f\u3044\u5408\u308f\u305b\u7a2e\u5225\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044' }),\n      }),\n    message: z\n      .string()\n      .min(10, '\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9\u306f10\u6587\u5b57\u4ee5\u4e0a\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044')\n      .max(1000, '\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9\u306f1000\u6587\u5b57\u4ee5\u5185\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044'),\n  })\n  .superRefine((data, ctx) =&gt; {\n    \/\/ \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u4e00\u81f4\u30c1\u30a7\u30c3\u30af\n    if (data.email !== data.emailConfirm) {\n      ctx.addIssue({\n        code: z.ZodIssueCode.custom,\n        message: '\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u4e00\u81f4\u3057\u307e\u305b\u3093',\n        path: ['emailConfirm'],\n      });\n    }\n\n    \/\/ \u898b\u7a4d\u3082\u308a\u4f9d\u983c\u306e\u5834\u5408\u3001\u96fb\u8a71\u756a\u53f7\u3092\u5fc5\u9808\u306b\u3059\u308b\n    if (data.inquiryType === '\u898b\u7a4d\u3082\u308a\u4f9d\u983c') {\n      if (!data.phone || data.phone === '') {\n        ctx.addIssue({\n          code: z.ZodIssueCode.custom,\n          message: '\u898b\u7a4d\u3082\u308a\u4f9d\u983c\u306e\u5834\u5408\u306f\u96fb\u8a71\u756a\u53f7\u304c\u5fc5\u9808\u3067\u3059',\n          path: ['phone'],\n        });\n      } else if (!phoneRegex.test(data.phone)) {\n        ctx.addIssue({\n          code: z.ZodIssueCode.custom,\n          message: '\u96fb\u8a71\u756a\u53f7\u306e\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093',\n          path: ['phone'],\n        });\n      }\n    }\n\n    \/\/ \u898b\u7a4d\u3082\u308a\u4f9d\u983c\u30fb\u30b5\u30fc\u30d3\u30b9\u306b\u3064\u3044\u3066\u30fb\u305d\u306e\u4ed6\u306e\u5834\u5408\u3001\u4f1a\u793e\u540d\u3092\u5fc5\u9808\u306b\u3059\u308b\n    if (data.inquiryType !== '\u63a1\u7528\u306b\u3064\u3044\u3066') {\n      if (!data.companyName || data.companyName === '') {\n        ctx.addIssue({\n          code: z.ZodIssueCode.custom,\n          message: '\u4f1a\u793e\u540d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044',\n          path: ['companyName'],\n        });\n      }\n    }\n  });\n\nexport type ContactFormData = z.infer&lt;typeof contactSchema&gt;;<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">\u4fee\u6b63\u306e\u30dd\u30a4\u30f3\u30c8\u306f\u4ee5\u4e0b\u306e3\u70b9\u3067\u3059\u3002<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>\u4fee\u6b631\uff1a<code>.refine()<\/code>\u306e\u9023\u9396\u3092<code>.superRefine()<\/code>\u306b\u7f6e\u304d\u63db\u3048<\/strong><\/p>\n\n<p class=\"wp-block-paragraph\"><code>.superRefine()<\/code>\u3092\u4f7f\u3046\u3068\u3001<code>ctx.addIssue()<\/code>\u3067\u8907\u6570\u306e\u30a8\u30e9\u30fc\u30921\u3064\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u95a2\u6570\u5185\u3067\u540c\u6642\u306b\u8ffd\u52a0\u3067\u304d\u307e\u3059\u3002\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u4e00\u81f4\u30c1\u30a7\u30c3\u30af\u3001\u96fb\u8a71\u756a\u53f7\u306e\u6761\u4ef6\u4ed8\u304d\u5fc5\u9808\u3001\u4f1a\u793e\u540d\u306e\u6761\u4ef6\u4ed8\u304d\u5fc5\u9808\u30921\u7b87\u6240\u306b\u307e\u3068\u3081\u3066\u66f8\u3051\u308b\u305f\u3081\u3001\u30b3\u30fc\u30c9\u306e\u898b\u901a\u3057\u3082\u826f\u304f\u306a\u308a\u307e\u3059\u3002\u8907\u6570\u306e\u76f8\u95a2\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u304c\u3042\u308b\u5834\u5408\u306f<code>.superRefine()<\/code>\u304c\u6b63\u89e3\u3067\u3059\u3002<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>\u4fee\u6b632\uff1a\u4f1a\u793e\u540d\u306e\u6761\u4ef6\u4ed8\u304d\u5fc5\u9808\u3092\u8ffd\u52a0<\/strong><\/p>\n\n<p class=\"wp-block-paragraph\"><code>inquiryType !== '\u63a1\u7528\u306b\u3064\u3044\u3066'<\/code>\u306e\u5834\u5408\u306b\u4f1a\u793e\u540d\u3092\u5fc5\u9808\u306b\u3059\u308b\u30ed\u30b8\u30c3\u30af\u3092<code>superRefine<\/code>\u5185\u306b\u8ffd\u52a0\u3057\u307e\u3057\u305f\u3002\u30d5\u30a3\u30fc\u30eb\u30c9\u5b9a\u7fa9\u81ea\u4f53\u306f<code>.optional().default('')<\/code>\u306b\u3057\u3066\u304a\u304d\u3001\u6761\u4ef6\u30c1\u30a7\u30c3\u30af\u306f<code>superRefine<\/code>\u306b\u96c6\u7d04\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>\u4fee\u6b633\uff1a\u7a7a\u6587\u5b57\u306e\u6271\u3044\u3092\u7d71\u4e00<\/strong><\/p>\n\n<p class=\"wp-block-paragraph\">phone\u3068companyName\u306b<code>.optional().default('')<\/code>\u3092\u8a2d\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002React Hook Form\u306e<code>defaultValues<\/code>\u3067\u7a7a\u6587\u5b57\u3092\u521d\u671f\u5024\u306b\u3057\u3066\u3044\u308b\u305f\u3081\u3001\u5b9f\u969b\u306b\u306f<code>.default('')<\/code>\u304c\u767a\u52d5\u3059\u308b\u5834\u9762\u306f\u5c11\u306a\u3044\u3067\u3059\u304c\u3001\u578b\u63a8\u8ad6\u4e0a\u306e\u6574\u5408\u6027\u3092\u4fdd\u3064\u76ee\u7684\u3067\u4ed8\u4e0e\u3057\u3066\u3044\u307e\u3059\u3002\u91cd\u8981\u306a\u306e\u306f\u3001<code>superRefine<\/code>\u5185\u3067\u7a7a\u6587\u5b57\u30c1\u30a7\u30c3\u30af\uff08<code>!data.phone || data.phone === ''<\/code>\uff09\u3092\u660e\u793a\u7684\u306b\u884c\u3046\u3053\u3068\u3067\u3001<code>undefined<\/code>\u3068\u7a7a\u6587\u5b57\u306e\u4e21\u65b9\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u308b\u70b9\u3067\u3059\u3002<\/p>\n\n<h2 class=\"wp-block-heading\">\u30d5\u30a9\u30fc\u30e0\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u5b9f\u88c5<\/h2>\n\n<p class=\"wp-block-paragraph\">React Hook Form\u3068\u306e\u63a5\u7d9a\u90e8\u5206\u3067\u3059\u3002<\/p>\n\n<pre class=\"wp-block-code\"><code>'use client';\n\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform\/resolvers\/zod';\nimport { contactSchema, type ContactFormData } from '.\/schema';\n\nexport default function ContactForm() {\n  const {\n    register,\n    handleSubmit,\n    watch,\n    formState: { errors, isSubmitting },\n  } = useForm&lt;ContactFormData&gt;({\n    resolver: zodResolver(contactSchema),\n    defaultValues: {\n      companyName: '',\n      name: '',\n      email: '',\n      emailConfirm: '',\n      phone: '',\n      inquiryType: undefined,\n      message: '',\n    },\n  });\n\n  const inquiryType = watch('inquiryType');\n\n  const onSubmit = async (data: ContactFormData) =&gt; {\n    console.log('\u9001\u4fe1\u30c7\u30fc\u30bf:', data);\n    \/\/ \u3053\u3053\u3067API\u3092\u547c\u3073\u51fa\u3059\n  };\n\n  return (\n    &lt;form onSubmit={handleSubmit(onSubmit)} noValidate&gt;\n      {inquiryType !== '\u63a1\u7528\u306b\u3064\u3044\u3066' &amp;&amp; (\n        &lt;div&gt;\n          &lt;label htmlFor=\"companyName\"&gt;\n            \u4f1a\u793e\u540d{inquiryType !== '\u63a1\u7528\u306b\u3064\u3044\u3066' &amp;&amp; &lt;span&gt;*&lt;\/span&gt;}\n          &lt;\/label&gt;\n          &lt;input id=\"companyName\" {...register('companyName')} \/&gt;\n          {errors.companyName &amp;&amp; (\n            &lt;p role=\"alert\"&gt;{errors.companyName.message}&lt;\/p&gt;\n          )}\n        &lt;\/div&gt;\n      )}\n\n      &lt;div&gt;\n        &lt;label htmlFor=\"name\"&gt;\u304a\u540d\u524d &lt;span&gt;*&lt;\/span&gt;&lt;\/label&gt;\n        &lt;input id=\"name\" {...register('name')} \/&gt;\n        {errors.name &amp;&amp; &lt;p role=\"alert\"&gt;{errors.name.message}&lt;\/p&gt;}\n      &lt;\/div&gt;\n\n      &lt;div&gt;\n        &lt;label htmlFor=\"email\"&gt;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9 &lt;span&gt;*&lt;\/span&gt;&lt;\/label&gt;\n        &lt;input id=\"email\" type=\"email\" {...register('email')} \/&gt;\n        {errors.email &amp;&amp; &lt;p role=\"alert\"&gt;{errors.email.message}&lt;\/p&gt;}\n      &lt;\/div&gt;\n\n      &lt;div&gt;\n        &lt;label htmlFor=\"emailConfirm\"&gt;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\uff08\u78ba\u8a8d\uff09 &lt;span&gt;*&lt;\/span&gt;&lt;\/label&gt;\n        &lt;input id=\"emailConfirm\" type=\"email\" {...register('emailConfirm')} \/&gt;\n        {errors.emailConfirm &amp;&amp; (\n          &lt;p role=\"alert\"&gt;{errors.emailConfirm.message}&lt;\/p&gt;\n        )}\n      &lt;\/div&gt;\n\n      &lt;div&gt;\n        &lt;label htmlFor=\"inquiryType\"&gt;\u304a\u554f\u3044\u5408\u308f\u305b\u7a2e\u5225 &lt;span&gt;*&lt;\/span&gt;&lt;\/label&gt;\n        &lt;select id=\"inquiryType\" {...register('inquiryType')}&gt;\n          &lt;option value=\"\"&gt;\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044&lt;\/option&gt;\n          &lt;option value=\"\u898b\u7a4d\u3082\u308a\u4f9d\u983c\"&gt;\u898b\u7a4d\u3082\u308a\u4f9d\u983c&lt;\/option&gt;\n          &lt;option value=\"\u30b5\u30fc\u30d3\u30b9\u306b\u3064\u3044\u3066\"&gt;\u30b5\u30fc\u30d3\u30b9\u306b\u3064\u3044\u3066&lt;\/option&gt;\n          &lt;option value=\"\u63a1\u7528\u306b\u3064\u3044\u3066\"&gt;\u63a1\u7528\u306b\u3064\u3044\u3066&lt;\/option&gt;\n          &lt;option value=\"\u305d\u306e\u4ed6\"&gt;\u305d\u306e\u4ed6&lt;\/option&gt;\n        &lt;\/select&gt;\n        {errors.inquiryType &amp;&amp; (\n          &lt;p role=\"alert\"&gt;{errors.inquiryType.message}&lt;\/p&gt;\n        )}\n      &lt;\/div&gt;\n\n      &lt;div&gt;\n        &lt;label htmlFor=\"phone\"&gt;\n          \u96fb\u8a71\u756a\u53f7{inquiryType === '\u898b\u7a4d\u3082\u308a\u4f9d\u983c' &amp;&amp; &lt;span&gt;*&lt;\/span&gt;}\n        &lt;\/label&gt;\n        &lt;input id=\"phone\" type=\"tel\" {...register('phone')} \/&gt;\n        {errors.phone &amp;&amp; &lt;p role=\"alert\"&gt;{errors.phone.message}&lt;\/p&gt;}\n      &lt;\/div&gt;\n\n      &lt;div&gt;\n        &lt;label htmlFor=\"message\"&gt;\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9 &lt;span&gt;*&lt;\/span&gt;&lt;\/label&gt;\n        &lt;textarea id=\"message\" rows={5} {...register('message')} \/&gt;\n        {errors.message &amp;&amp; &lt;p role=\"alert\"&gt;{errors.message.message}&lt;\/p&gt;}\n      &lt;\/div&gt;\n\n      &lt;button type=\"submit\" disabled={isSubmitting}&gt;\n        {isSubmitting ? '\u9001\u4fe1\u4e2d...' : '\u9001\u4fe1\u3059\u308b'}\n      &lt;\/button&gt;\n    &lt;\/form&gt;\n  );\n}<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u90e8\u5206\u306fAI\u306e\u51fa\u529b\u304c\u307b\u307c\u305d\u306e\u307e\u307e\u4f7f\u3048\u307e\u3057\u305f\u3002<code>register()<\/code>\u306e\u4f7f\u3044\u65b9\u3001<code>errors<\/code>\u306e\u8868\u793a\u3001<code>watch()<\/code>\u306b\u3088\u308b\u6761\u4ef6\u4ed8\u304d\u8868\u793a\u306a\u3069\u306f\u3001React Hook Form\u306e\u6a19\u6e96\u30d1\u30bf\u30fc\u30f3\u306a\u306e\u3067AI\u304c\u6b63\u78ba\u306b\u66f8\u3051\u307e\u3059\u3002<\/p>\n\n<h2 class=\"wp-block-heading\">AI\u304c\u5f97\u610f\u306a\u90e8\u5206\u3068\u82e6\u624b\u306a\u90e8\u5206\u306e\u307e\u3068\u3081<\/h2>\n\n<p class=\"wp-block-paragraph\">\u4eca\u56de\u306e\u5b9f\u88c5\u3092\u901a\u3058\u3066\u898b\u3048\u305f\u3001\u30d5\u30a9\u30fc\u30e0\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306b\u304a\u3051\u308bAI\u306e\u5f97\u610f\u30fb\u4e0d\u5f97\u610f\u3092\u6574\u7406\u3057\u307e\u3059\u3002<\/p>\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u4f5c\u696d<\/th><th>AI\u306e\u7cbe\u5ea6<\/th><th>\u7406\u7531<\/th><\/tr><\/thead><tbody><tr><td>Zod\u306e\u57fa\u672c\u30b9\u30ad\u30fc\u30de\u5b9a\u7fa9\uff08\u578b\u3001min\/max\u3001regex\uff09<\/td><td>\u9ad8<\/td><td>\u30d1\u30bf\u30fc\u30f3\u304c\u6c7a\u307e\u3063\u3066\u3044\u308b<\/td><\/tr><tr><td>React Hook Form\u306e\u30d5\u30a9\u30fc\u30e0\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8<\/td><td>\u9ad8<\/td><td>register\u3001errors\u3001handleSubmit\u306f\u5b9a\u578b<\/td><\/tr><tr><td>TypeScript\u306e\u578b\u63a8\u8ad6\uff08z.infer\uff09<\/td><td>\u9ad8<\/td><td>\u69cb\u6587\u3068\u3057\u3066\u660e\u78ba<\/td><\/tr><tr><td>\u5358\u4e00\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/td><td>\u9ad8<\/td><td>\u5404\u30d5\u30a3\u30fc\u30eb\u30c9\u72ec\u7acb\u3067\u5224\u65ad\u3067\u304d\u308b<\/td><\/tr><tr><td>\u76f8\u95a2\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\uff08\u30d5\u30a3\u30fc\u30eb\u30c9\u9593\u306e\u4f9d\u5b58\uff09<\/td><td>\u4f4e<\/td><td>\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u306e\u7406\u89e3\u304c\u5fc5\u8981<\/td><\/tr><tr><td>\u6761\u4ef6\u4ed8\u304d\u5fc5\u9808\u306e\u8a2d\u8a08<\/td><td>\u4f4e<\/td><td>\u300c\u3044\u3064\u5fc5\u9808\u306b\u3059\u308b\u304b\u300d\u306f\u30d3\u30b8\u30cd\u30b9\u8981\u4ef6<\/td><\/tr><tr><td>.refine() vs .superRefine() \u306e\u9078\u629e<\/td><td>\u4f4e<\/td><td>\u5b9f\u884c\u9806\u5e8f\u306e\u5f71\u97ff\u3092AI\u304c\u4e88\u6e2c\u3057\u306b\u304f\u3044<\/td><\/tr><tr><td>\u7a7a\u6587\u5b57 vs undefined \u306e\u6271\u3044<\/td><td>\u4f4e<\/td><td>HTML\u306e\u5b9f\u969b\u306e\u6319\u52d5\u3068Zod\u306e\u578b\u306e\u5dee\u7570<\/td><\/tr><\/tbody><\/table><\/figure>\n\n<p class=\"wp-block-paragraph\">\u30d1\u30bf\u30fc\u30f3\u304c\u6c7a\u307e\u3063\u3066\u3044\u308b\u5b9a\u578b\u7684\u306a\u90e8\u5206\u306fAI\u306b\u4efb\u305b\u3001\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u306e\u5224\u65ad\u304c\u5fc5\u8981\u306a\u76f8\u95a2\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306f\u4eba\u9593\u304c\u8a2d\u8a08\u3059\u308b\u3002\u3053\u306e\u5207\u308a\u5206\u3051\u3092\u610f\u8b58\u3059\u308b\u3060\u3051\u3067\u3001AI\u99c6\u52d5\u958b\u767a\u306e\u52b9\u7387\u306f\u5927\u304d\u304f\u5909\u308f\u308a\u307e\u3059\u3002<\/p>\n\n<h2 class=\"wp-block-heading\">\u307e\u3068\u3081<\/h2>\n\n<p class=\"wp-block-paragraph\">React Hook Form + Zod \u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5\u3092AI\u99c6\u52d5\u3067\u884c\u3063\u305f\u7d50\u679c\u3092\u6574\u7406\u3057\u307e\u3059\u3002<\/p>\n\n<ul class=\"wp-block-list\"><li>Zod\u306e\u57fa\u672c\u30b9\u30ad\u30fc\u30de\u5b9a\u7fa9\u3068React Hook Form\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306f\u3001AI\u306e\u51fa\u529b\u304c\u307b\u307c\u305d\u306e\u307e\u307e\u4f7f\u3048\u308b<\/li><li>\u76f8\u95a2\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\uff08\u30d5\u30a3\u30fc\u30eb\u30c9\u9593\u306e\u4f9d\u5b58\u30c1\u30a7\u30c3\u30af\uff09\u306f\u3001AI\u306b\u4efb\u305b\u308b\u3068<code>.refine()<\/code>\u306e\u9023\u9396\u306b\u306a\u308a\u3084\u3059\u3044\u3002<code>.refine()<\/code>\u306f1\u56de\u306b\u3064\u304d1\u30a8\u30e9\u30fc\u3057\u304b\u51fa\u305b\u306a\u3044\u305f\u3081\u3001\u8907\u6570\u30d5\u30a3\u30fc\u30eb\u30c9\u3078\u306e\u540c\u6642\u30a8\u30e9\u30fc\u4ed8\u4e0e\u306b\u306f<code>.superRefine()<\/code>\u304c\u5fc5\u8981\u3002\u3053\u306e\u66f8\u304d\u63db\u3048\u5224\u65ad\u306f\u4eba\u9593\u304c\u3059\u3079\u304d<\/li><li>HTML\u306einput\u304c\u8fd4\u3059\u7a7a\u6587\u5b57<code>\"\"<\/code>\u3068Zod\u306e<code>.optional()<\/code>\uff08<code>undefined<\/code>\u3092\u8a31\u53ef\uff09\u306e\u6319\u52d5\u306e\u5dee\u306f\u3001AI\u304c\u898b\u843d\u3068\u3057\u3084\u3059\u3044\u30dd\u30a4\u30f3\u30c8<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">\u30d5\u30a9\u30fc\u30e0\u306f\u300c\u898b\u305f\u76ee\u300d\u3088\u308a\u3082\u300c\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306e\u8a2d\u8a08\u300d\u304c\u54c1\u8cea\u3092\u5de6\u53f3\u3057\u307e\u3059\u3002AI\u304c\u66f8\u3044\u305f\u57fa\u672c\u30b9\u30ad\u30fc\u30de\u306e\u4e0a\u306b\u3001\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u3092\u4eba\u9593\u304c\u8a2d\u8a08\u3057\u3066\u4e57\u305b\u308b\u3002\u3053\u306e\u9806\u756a\u3067\u3084\u308b\u3068\u3001\u624b\u623b\u308a\u304c\u5c11\u306a\u304f\u52b9\u7387\u7684\u3067\u3059\u3002<\/p>\n\n<p class=\"wp-block-paragraph\">\u682a\u5f0f\u4f1a\u793e\u30d5\u30a1\u30b9\u30c8\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3067\u306f\u3001React\/Next.js\u306e\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u5b9f\u88c5\u3084AI\u99c6\u52d5\u958b\u767a\u306e\u3054\u76f8\u8ac7\u3092\u627f\u3063\u3066\u3044\u307e\u3059\u3002\u304a\u56f0\u308a\u3054\u3068\u304c\u3042\u308c\u3070\u3001<a href=\"https:\/\/fastcoding.jp\/contact\/\">\u304a\u554f\u3044\u5408\u308f\u305b\u30d5\u30a9\u30fc\u30e0<\/a>\u304b\u3089\u304a\u6c17\u8efd\u306b\u3054\u9023\u7d61\u304f\u3060\u3055\u3044\u3002<\/p><\/div>","protected":false},"excerpt":{"rendered":"<p>\u682a\u5f0f\u4f1a\u793e\u30d5\u30a1\u30b9\u30c8\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u30d5\u30eb\u30b9\u30bf\u30c3\u30af\u30a8\u30f3\u30b8\u30cb\u30a2 MrFire\u3067\u3059\u3002 \u5148\u65e5\u3001\u30d0\u30a4\u30af\u306e\u8eca\u691c\u3092\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u4e88\u7d04\u3057\u3088\u3046\u3068\u3057\u305f\u3089\u3001\u30d5\u30a9\u30fc\u30e0\u306e\u5165\u529b\u9805\u76ee\u304c20\u500b\u4ee5\u4e0a\u3042\u308a\u307e\u3057\u305f\u3002\u3057\u304b\u3082\u9014\u4e2d\u3067\u300c\u8eca\u691c\u8a3c\u306e\u6709\u52b9\u671f\u9650\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u300d\u3068 [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":9943,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[754],"tags":[741,757,748,23],"class_list":["post-9918","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-driven-development","tag-ai","tag-757","tag-748","tag-23"],"acf":[],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u682a\u5f0f\u4f1a\u793e\u30d5\u30a1\u30b9\u30c8\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u30d5\u30eb\u30b9\u30bf\u30c3\u30af\u30a8\u30f3\u30b8\u30cb\u30a2 MrFire\u3067\u3059\u3002 \u5148\u65e5\u3001\u30d0\u30a4\u30af\u306e\u8eca\u691c\u3092\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u4e88\u7d04\" \/>\n\t<meta name=\"robots\" content=\"max-snippet:160, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"MrFire\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/fastcoding.jp\/blog\/ai-driven-development\/ai-driven-form-validation\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"ja_JP\" \/>\n\t\t<meta property=\"og:site_name\" content=\"FASTCODING BLOG | \u682a\u5f0f\u4f1a\u793e\u30d5\u30a1\u30b9\u30c8\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u516c\u5f0f\u30d6\u30ed\u30b0\u3067\u3059\u3002HTML\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3084JavaScript\u958b\u767a\u3001WordPress\u5236\u4f5c\u3092\u4e2d\u5fc3\u306b\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u958b\u767a\u306b\u95a2\u3059\u308b\u60c5\u5831\u304c\u6e80\u8f09\u3067\u3059\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"React Hook Form + Zod \u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092AI\u99c6\u52d5\u3067\u5b9f\u88c5\u3059\u308b \u2500 AI\u304c\u5f97\u610f\u306a\u90e8\u5206\u3068\u4eba\u9593\u304c\u5224\u65ad\u3059\u3079\u304d\u90e8\u5206 | FASTCODING BLOG\" \/>\n\t\t<meta property=\"og:description\" content=\"\u682a\u5f0f\u4f1a\u793e\u30d5\u30a1\u30b9\u30c8\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u30d5\u30eb\u30b9\u30bf\u30c3\u30af\u30a8\u30f3\u30b8\u30cb\u30a2 MrFire\u3067\u3059\u3002 \u5148\u65e5\u3001\u30d0\u30a4\u30af\u306e\u8eca\u691c\u3092\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u4e88\u7d04\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/fastcoding.jp\/blog\/ai-driven-development\/ai-driven-form-validation\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/fastcoding.jp\/blog\/wp-content\/uploads\/2026\/07\/e27159f963d1e3b5ed2480ea9290d993-1.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/fastcoding.jp\/blog\/wp-content\/uploads\/2026\/07\/e27159f963d1e3b5ed2480ea9290d993-1.png\" \/>\n\t\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-07-06T03:21:49+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-07-06T03:21:57+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/FASTCODING.jp\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"React Hook Form + Zod \u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092AI\u99c6\u52d5\u3067\u5b9f\u88c5\u3059\u308b \u2500 AI\u304c\u5f97\u610f\u306a\u90e8\u5206\u3068\u4eba\u9593\u304c\u5224\u65ad\u3059\u3079\u304d\u90e8\u5206 | FASTCODING BLOG\" \/>\n\t\t<meta name=\"twitter:description\" content=\"\u682a\u5f0f\u4f1a\u793e\u30d5\u30a1\u30b9\u30c8\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u30d5\u30eb\u30b9\u30bf\u30c3\u30af\u30a8\u30f3\u30b8\u30cb\u30a2 MrFire\u3067\u3059\u3002 \u5148\u65e5\u3001\u30d0\u30a4\u30af\u306e\u8eca\u691c\u3092\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u4e88\u7d04\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/fastcoding.jp\/blog\/wp-content\/uploads\/2026\/07\/e27159f963d1e3b5ed2480ea9290d993-1.png\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"React Hook Form + Zod \u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092AI\u99c6\u52d5\u3067\u5b9f\u88c5\u3059\u308b \u2500 AI\u304c\u5f97\u610f\u306a\u90e8\u5206\u3068\u4eba\u9593\u304c\u5224\u65ad\u3059\u3079\u304d\u90e8\u5206 | FASTCODING BLOG","description":"\u682a\u5f0f\u4f1a\u793e\u30d5\u30a1\u30b9\u30c8\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u30d5\u30eb\u30b9\u30bf\u30c3\u30af\u30a8\u30f3\u30b8\u30cb\u30a2 MrFire\u3067\u3059\u3002 \u5148\u65e5\u3001\u30d0\u30a4\u30af\u306e\u8eca\u691c\u3092\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u4e88\u7d04","canonical_url":"https:\/\/fastcoding.jp\/blog\/ai-driven-development\/ai-driven-form-validation\/","robots":"max-snippet:160, max-image-preview:large, max-video-preview:-1","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ja_JP","og:site_name":"FASTCODING BLOG | \u682a\u5f0f\u4f1a\u793e\u30d5\u30a1\u30b9\u30c8\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u516c\u5f0f\u30d6\u30ed\u30b0\u3067\u3059\u3002HTML\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3084JavaScript\u958b\u767a\u3001WordPress\u5236\u4f5c\u3092\u4e2d\u5fc3\u306b\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u958b\u767a\u306b\u95a2\u3059\u308b\u60c5\u5831\u304c\u6e80\u8f09\u3067\u3059","og:type":"article","og:title":"React Hook Form + Zod \u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092AI\u99c6\u52d5\u3067\u5b9f\u88c5\u3059\u308b \u2500 AI\u304c\u5f97\u610f\u306a\u90e8\u5206\u3068\u4eba\u9593\u304c\u5224\u65ad\u3059\u3079\u304d\u90e8\u5206 | FASTCODING BLOG","og:description":"\u682a\u5f0f\u4f1a\u793e\u30d5\u30a1\u30b9\u30c8\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u30d5\u30eb\u30b9\u30bf\u30c3\u30af\u30a8\u30f3\u30b8\u30cb\u30a2 MrFire\u3067\u3059\u3002 \u5148\u65e5\u3001\u30d0\u30a4\u30af\u306e\u8eca\u691c\u3092\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u4e88\u7d04","og:url":"https:\/\/fastcoding.jp\/blog\/ai-driven-development\/ai-driven-form-validation\/","og:image":"https:\/\/fastcoding.jp\/blog\/wp-content\/uploads\/2026\/07\/e27159f963d1e3b5ed2480ea9290d993-1.png","og:image:secure_url":"https:\/\/fastcoding.jp\/blog\/wp-content\/uploads\/2026\/07\/e27159f963d1e3b5ed2480ea9290d993-1.png","og:image:width":1280,"og:image:height":675,"article:published_time":"2026-07-06T03:21:49+00:00","article:modified_time":"2026-07-06T03:21:57+00:00","article:publisher":"https:\/\/www.facebook.com\/FASTCODING.jp","twitter:card":"summary_large_image","twitter:title":"React Hook Form + Zod \u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092AI\u99c6\u52d5\u3067\u5b9f\u88c5\u3059\u308b \u2500 AI\u304c\u5f97\u610f\u306a\u90e8\u5206\u3068\u4eba\u9593\u304c\u5224\u65ad\u3059\u3079\u304d\u90e8\u5206 | FASTCODING BLOG","twitter:description":"\u682a\u5f0f\u4f1a\u793e\u30d5\u30a1\u30b9\u30c8\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u30d5\u30eb\u30b9\u30bf\u30c3\u30af\u30a8\u30f3\u30b8\u30cb\u30a2 MrFire\u3067\u3059\u3002 \u5148\u65e5\u3001\u30d0\u30a4\u30af\u306e\u8eca\u691c\u3092\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u4e88\u7d04","twitter:image":"https:\/\/fastcoding.jp\/blog\/wp-content\/uploads\/2026\/07\/e27159f963d1e3b5ed2480ea9290d993-1.png"},"aioseo_meta_data":{"post_id":"9918","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-06-28 13:31:50","updated":"2026-07-07 00:59:09","seo_analyzer_scan_date":null},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/fastcoding.jp\/blog\/wp-content\/uploads\/2026\/07\/e27159f963d1e3b5ed2480ea9290d993-1.png","jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fastcoding.jp\/blog\/wp-json\/wp\/v2\/posts\/9918","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fastcoding.jp\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fastcoding.jp\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fastcoding.jp\/blog\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/fastcoding.jp\/blog\/wp-json\/wp\/v2\/comments?post=9918"}],"version-history":[{"count":1,"href":"https:\/\/fastcoding.jp\/blog\/wp-json\/wp\/v2\/posts\/9918\/revisions"}],"predecessor-version":[{"id":9925,"href":"https:\/\/fastcoding.jp\/blog\/wp-json\/wp\/v2\/posts\/9918\/revisions\/9925"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fastcoding.jp\/blog\/wp-json\/wp\/v2\/media\/9943"}],"wp:attachment":[{"href":"https:\/\/fastcoding.jp\/blog\/wp-json\/wp\/v2\/media?parent=9918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fastcoding.jp\/blog\/wp-json\/wp\/v2\/categories?post=9918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fastcoding.jp\/blog\/wp-json\/wp\/v2\/tags?post=9918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}