devlog study typescript zod validator

TypeScript ๐Ÿ“

  • ์ƒˆ์‹น ํ’€์Šคํƒ ๊ณผ์ •
    • ๊ฐ•์˜ ๋“ฃ๊ณ  ์ •๋ฆฌ
    • LLM ํ™œ์šฉ ๋‚ด์šฉ ๋ณด์ถฉ

๋‚ด์–ด๋ณด๊ธฐ

Zod

  • TypeScript-first schema validation

z.treeifyError()

  • ZodError๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ๋ฅผ ๋ฐ
    • ์ด๋ฅผ ๊ฐ์ฒด ํƒ€์ž… ์—๋Ÿฌ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” method
 
z.string("Not a string!").parse(12);
// =>
โŒ throws ZodError {
   issues: [
     {
       expected: 'string',
       code: 'invalid_type',
       path: [],
       message: 'Not a string!'   <-- ๐Ÿ‘€ custom error message
     }
   ]
 }
 
const tree = z.treeifyError(result.error);
// =>
{
  errors: [ 'Unrecognized key: "extraKey"' ],
  properties: {
    username: { errors: [ 'Invalid input: expected string, received number' ] },
    favoriteNumbers: {
      errors: [],
      items: [
        undefined,
        {
          errors: [ 'Invalid input: expected number, received string' ]
        }
      ]
    }
  }
}

ZodSafeParseResult

  • ZodSafeParseResult in Zod (v4) is a type used with the safeParse and safeParseAsync methods. It represents the result of parsing data with a schema, capturing either the parsed data (on success) or error details (on failure).
  • success / error ๊ตฌ์กฐ
    • error: unknown ํƒ€์ž…

๐Ÿ’ก typecheck ํžŒํŠธ์šฉ ์ฝ”๋“œ

export const validateAsync = async <T extends z.ZodObject>(
  zobj: T,
  obj: FormData | Record<string, FormDataEntryValue | string | unknown>,
): Promise<[ValidError] | [undefined, z.core.output<T>]> => {
  try {
    // ...
  } catch (e) {
    // ...
  }
};

FormDataEntryValue | string | unknown ์˜๋ฏธ

โ€œ์ด ์ž๋ฆฌ์— ์–ด๋–ค ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ์ˆ˜ ์žˆ๋Š”์ง€โ€ ์— ๋Œ€ํ•œ ํžŒํŠธ๋ฅผ ๋‚จ๊ธฐ๋Š” ์žฅ์น˜

  • FormDataEntryValue : ๋ธŒ๋ผ์šฐ์ € FormData ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‹ค์ œ ๊ฐ’์˜ ํƒ€์ž…(string | File)

  • string : server side์—์„œ ์ผ๋ฐ˜ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๋ฐ›์„์ˆ˜๋„ ์žˆ์Œ

  • unknown : ์•„์ง ๋ช…ํ™•ํžˆ ์ •ํ•ด์ง€์ง€ ์•Š์€ ํƒ€์ž…

    • ์™ธ๋ถ€์—์„œ ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด์˜ฌ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘  ์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ์ž‘์„ฑํ•ด๋‘๋ฉด,
      โ€œ์ด ๊ฐ’์€ ์ตœ์†Œํ•œ FormDataEntryValue, string, ํ˜น์€ ๊ทธ ๋ฐ–์˜ ์–ด๋–ค ๊ฐ’(unknown)์ผ์ˆ˜ ์žˆ๋‹คโ€ ๋Š” ์˜๋„๋ฅผ ๋ช…์‹œํ•˜๊ฒŒ ๋จ
  • unknownํ•˜๋‚˜๋งŒ ๋‚จ๊ฒจ๋‘”๋‹ค๋ฉด,

    • *โ€œ์ด ์ž๋ฆฌ์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ์ˆ˜ ์žˆ๋Š”์ง€โ€*์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ํžŒํŠธ๊ฐ€ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง
    • ์ฒญ์†Œ๋…„ | ์ฒญ๋…„ | ์‚ฌ๋žŒ ์ด๋ผ๊ณ  ์ ๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€์ด์ง€๋งŒ, ์ฝ”๋“œ ํ•ด์„์‹œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ• ์ˆ˜ ์žˆ์Œ

์˜๋ฌธ๊ฐ–๊ธฐ


์ฐพ์•„๋ณด๊ธฐ

  • [ ]