Zod 모드로 값을 검증하는 Assiertion Function 정의

12189 단어 TypeScriptzodtech
Assiertion Function을 정의하는 방법을 작성하여 Zod에 정의된 패턴과 일치하는지 확인합니다.

zed가 뭐예요?


Zod is a TypeScript-first schema declaration and validation library.
https://www.npmjs.com/package/zod
"TypeScript 첫 번째 모드 정의, Validation 라이브러리."이 기사는 상세한 설명이 없으니 모르시는 분들은 조드에 대한 README와 조드에 대한 소개를 보셔도 됩니다.
  • https://github.com/colinhacks/zod#readme
  • 진정한 Type Script first 획득
  • Assiertion Function이란 무엇입니까?


    TypeScript 3.7에 추가된 기능입니다.
    https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#assertion-functions
    사용자 정의 type guards와 비슷하지만 값을 확인한 후 유형에 맞지 않는다고 판단되면 boolean이 반환되지 않고 therow Error가 반환됩니다.
    ※ 엄밀히 말하면 이 설명은 잘못된 것 같습니다.결단이 type gurd 기능을 가지도록 하기 위해서인 것 같아요.
    // ユーザー定義のtype guards
    // 値の検証結果をbooleanで返す
    function isString(value: unknown): value is string {
      return typeof value === 'string';
    }
    
    // Assertion Functions
    function assertString(value: unknown): asserts value is string {
      if (typeof value !== 'string') {
        throw new Error('…');
      }
    }
    
    // Node.jsのassertモジュールも
    // Assertion Functionsの恩恵を受けれるようになっていた気がする。
    import assert from "assert";
    const value: unknown = 'hoge';
    assert(typeof value === 'string');
    value; // string
    
    자세한 내용은 이미 많은 사람들이 기사를 썼으니 읽어주세요.다음은 uhyo씨의 보도 등입니다. 상세하게 쓸 수 있을 것 같습니다.
    Type Script 3.7의 asserts x is T형은 어떻게 위험한가-Qita

    Zod 모드로 값 검증


    예:
    asserts.ts
    import { z, ZodType } from "zod";
    
    export function assertZodSchema<T extends ZodType<any, any, any>>(
      schema T,
      value: unknown
    ): asserts value is z.infer<T> {
      schema.parse(value);
    }
    
    아래와 같이 사용한다.
    import { z } from "zod";
    import { assertZodType } from "./asserts";
    
    const hogeSchema = z.string();
    
    const value: unknown = 'hoge';
    assertZodSchema(hogeSchema, value);
    value; // string
    
    그나저나 다른 언어의 결단은 끄기(ex:java, PHP 등), ECMAScript와 노드를 설정할 수 있는 경우가 많다고 생각합니다.js는 그런 기능이 없습니다.다음과 같이 스스로 실시하거나 unassert 제거 결단을 사용해야 한다.
    asserts.ts
    export function assertZodSchema<T extends ZodType<any, any, any>>(
      zodType T,
      value: unknown
    ): asserts value is z.infer<T> {
      if (process.env.NODE_ENV !== 'production') {
        zodType.parse(value);
      }
    }
    

    장점: "asserts의 위험성을 피할 수 있다"


    상술한 uhyo의 글에서 asserts의 위험성에 대해 다음과 같이 기술한다.
    방금 소개한 편리한 asserts형 술어지만 실제로는 함부로 사용하면 위험하다.위험은 무슨 뜻이냐면, 타입 스크립트가 어렵게 보장한 보안을 파괴했다는 것이다.
    https://qiita.com/uhyo/items/b8d2ea6fbf6214fc4194
    다음 예는 극단적이지만 사용자정의 Asserion Function이 유효성 검사 로직에 오류가 있으면 유형의 보안을 보장할 수 없습니다.
    function assertString(value: unknown): asserts value is string {
      // 何も…
      // 検証していないのである!!!
    }
    
    const value: unknown = 1000000;
    assertString(value);
    value; // 実態はnumberだが、TSの静的解析上はstringになり、実行時のどこかで死ぬかも
    
    assertZodSchema는 Zod의 모델에 따라 검증 후 해결하는 유형을 결정하기 때문에 Zod에 오류가 없으면 검증 논리와 유형이 서로 어긋나지 않는다.

    끝맺다


    실제 업무에서 Assertion Function은 Lambda의 프로세서 매개변수 유형과 설정 파일에서 읽은 데이터 유형 등을 검증하는 데 사용됩니다.type guard와 차별화해서 사용하지만, 개인적으로는 "type guard로 쓰면 검증 실패 시 처리를 써야 하는데 본격 촬영 때는 절대 거기에 들어가면 안 되고, 그리고 저는 as로 출연하기 싫은 사람~"이라고 말할 때 Assiertion Function을 선택할 수도 있다.

    좋은 웹페이지 즐겨찾기