SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

JavaScriptの限界を超える!TypeScript初めの一歩

【TypeScriptの基礎を学ぶ】外部ライブラリを安全に使いこなす!型定義の扱いとエコシステムの活用法

JavaScriptの限界を超える!TypeScript初めの一歩 第5回

  • X ポスト
  • このエントリーをはてなブックマークに追加

第2章 TypeScriptの開発を加速するエコシステム

入力値の検証をサポートする「zod」

 今回は、@typesで型定義ファイルが配布されていることを確認しました。このようにTypeScriptは単体で機能しているのではなく、多くの開発者が提供するエコシステム(周辺ツールやライブラリ群)によって機能しています。

 そうした中から、1つの例として、有名なものを紹介します。バリデーションライブラリ「zod」です。バリデーションは確認や検証を意味する言葉です。

zod - npm

 それでは、またプロジェクトを作りましょう。ファイル構成とpackage.jsontsconfig.jsonの設定は先ほどと同じです。ファイル構成だけを示します。

▶ファイル構成

  • プロジェクトのルート/
    • dist/
    • src/
      • index.ts
    • package.json
    • tsconfig.json

 zodをインストールします。

npm install zod

zodの使用例1:parseによる検証

 src/index.jsに、データを確認する簡単なコードを書きます。

 まずは、型を定義します。

import { z } from 'zod';

const UserSchema = z.object({
    name: z.string(),
    age: z.number(),
});

type User = z.infer<typeof UserSchema>; // 型推論でUser型を作成

 zodからzをインポートします。そしてzを利用してUserSchemaを作り、z.infer<typeof UserSchema>でUser型を作ります。

 次に、データを取得・検証するfetchUser関数を作成します。

async function fetchUser(id: number): Promise<User> {
    const fakeFetch = [
        {"name": "Tom", "age": 10}, 
        {"name": "Bob"},
    ];
    const data = fakeFetch[id];
    return UserSchema.parse(data); // 検証+型変換
}

 本来ならawait fetch(~)とデータを取得するところですが、fakeFetchというオブジェクトの値で代用します。

 UserSchema.parseで、検証と型変換をおこないます。成功したときはUser型のオブジェクトが返ります。失敗したときは例外が発生します。

 最後に、fetchUser関数を利用した処理を記述します。

for (let i = 0; i < 3; i ++) {
    try {
        let res: User = await fetchUser(i); // 失敗時は例外発生
        console.log(i, res);
    } catch(e) {
        if (e instanceof z.ZodError) {
            const msg = e.issues.map(x => x.message);
            console.log(i, "失敗", msg);
        }
    }
}

 User型のオブジェクトresを得て出力します。失敗したときは例外が発生します。catchで捕捉するez.ZodErrorのインスタンスならメッセージを得て出力します。

 実行結果を示します。

実行結果
0 { name: 'Tom', age: 10 }
1 失敗 [ 'Required' ]
2 失敗 [ 'Required' ]

 fakeFetch[id]の値が正しいUser型なら、取得したデータが表示されます。欠けたデータや、undefinedのときは失敗します。

zodの使用例2:詳細なルールとsafeParse関数の活用

 src/index.jsのプログラムを書き換えます。

 まずは前半です。

import { z } from 'zod';

const UserSchema2 = z.object({
    name: z.string()
        .min(1, "1文字未満")
        .max(8, "8文字超過")
        .regex(/\D/),
    email: z.string()
        .email(),
    age: z.number()
        .int()
        .positive()
        .optional(),
});

type User2 = z.infer<typeof UserSchema2>;

 zodでは、各プロパティに対して検証方法を細かく指定できます。また失敗時のメッセージを設定することも可能です。

 zodにはさまざまな検証方法が用意されています。次の公式ページにまとまっています。

Defining schemas | Zod

 次は後半です。

const data = [
    {name: "Tom", email: "x@example.com", age: 10},
    {name: "Bob", email: "x@example.com", age: 11},
    {name: "Sam", email: "x[@]example.com"},
    {name: "HogeHoger", email: "x@example.com"},
    {name: "Tom3", email: "x@example.com"},
    {name: "Ham", email: "x@example.com", age: 0.3},
]

data.forEach(x => {
    const res = UserSchema2.safeParse(x);
    if (res.success) {
        console.log('成功:', res.data);
    } else {
        const msg = res.error.issues.map(x => x.message);
        console.log('失敗:', msg);
    }
});

 検証用のデータを用意して、1つずつ検証しています。

 最初の例ではparse関数を使い、検証に失敗した際は例外を発生させました。ここではsafeParse関数を使います。

 safeParse関数を使えば、失敗しても例外は発生しません。res.successで成功したかを判定して、処理を分岐できます。

 実行結果を示します。

実行結果
成功: { name: 'Tom', email: 'x@example.com', age: 10 }
成功: { name: 'Bob', email: 'x@example.com', age: 11 }
失敗: [ 'Invalid email' ]
失敗: [ '8文字超過' ]
成功: { name: 'Tom3', email: 'x@example.com' }
失敗: [ 'Expected integer, received float' ]

 このように、より詳細なバリデーションルールを設定できることが分かります。

次のページ
第3章 まとめ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
JavaScriptの限界を超える!TypeScript初めの一歩連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

CodeZine編集部(コードジンヘンシュウブ)

CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/21599 2025/10/02 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング