ホームページ >ウェブフロントエンド >jsチュートリアル >TypeScript でインターフェイスと検証スキーマを動的に生成する (Yup)
最近のプロジェクトでは、キーが一定のマッピングによって動的に定義され、少なくとも1つのキーが効果的な値を持っていたオブジェクトが必要な問題に遭遇しました。
チャレンジ
有効なキーと対応するタイプを定義するメタデータアマップオブジェクトがあります。
このマッピングによると、:
が必要です<code class="language-typescript">const MetadataMap = { userId: Number, utmSource: String, utmMedium: String, utmCampaign: String, } as const;</code>
タイプのセキュリティを強制するためにタイプスクリプトインターフェイスを動的に生成します。
MetadatAmapからTypeScriptインターフェイスを生成するために、
とマッピングタイプを使用しました。以下は、私たちがそれを定義する方法です:
この方法により、メタデータの更新がメタデータインターフェイスに自動的に反映されることが保証されます。たとえば、keyof
<code class="language-typescript">type Metadata = { [K in keyof typeof MetadataMap]: typeof MetadataMap[K] extends NumberConstructor ? number : string; };</code>
ステップ2:yupモードを動的に生成
<code class="language-typescript">interface Metadata { userId?: number; utmSource?: string; utmMedium?: string; utmCampaign?: string; }</code>メタデータのキーとタイプに一致するYUPモードを動的に作成する必要があります。
およびを使用して、各キーを対応するYUP検証デバイスにマッピングします。 この方法はハードコーディングを排除し、メタデータの変化が手動の更新なしでモードに反映されることを保証します。
ステップ3:「少なくとも1つのキー」ルールを追加しますObject.keys
reduce
<code class="language-typescript">const metadataSchema = Yup.object( Object.keys(MetadataMap).reduce((schema, key) => { const type = MetadataMap[key as keyof typeof MetadataMap]; if (type === Number) { schema[key] = Yup.number().optional(); } else if (type === String) { schema[key] = Yup.string().optional(); } return schema; }, {} as Record<string, any>) );</code>メソッドを追加しました:
このロジック:
オブジェクトが効果的であることを確認してください。
.test
メタデータから有効なキーを動的に抽出します。
<code class="language-typescript">metadataSchema.test( "at-least-one-key", "Metadata must have at least one valid key.", (value) => { if (!value || typeof value !== "object") return false; const validKeys = Object.keys(MetadataMap) as (keyof typeof MetadataMap)[]; return validKeys.some((key) => key in value && value[key] !== undefined); } );</code>非定義値で少なくとも1つのキーを確認します。
以上がTypeScript でインターフェイスと検証スキーマを動的に生成する (Yup)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。