ホームページ >ウェブフロントエンド >jsチュートリアル >TypeScript でインターフェイスと検証スキーマを動的に生成する (Yup)

TypeScript でインターフェイスと検証スキーマを動的に生成する (Yup)

DDD
DDDオリジナル
2025-01-24 16:35:11962ブラウズ

Dynamically Generating Interfaces and Validation Schemas in TypeScript with Yup

最近のプロジェクトでは、キーが一定のマッピングによって動的に定義され、少なくとも1つのキーが効果的な値を持っていたオブジェクトが必要な問題に遭遇しました。

チャレンジ

有効なキーと対応するタイプを定義するメタデータアマップオブジェクトがあります。

このマッピングによると、

が必要です
<code class="language-typescript">const MetadataMap = {  
 userId: Number,  
 utmSource: String,  
 utmMedium: String,  
 utmCampaign: String,  
} as const;</code>

タイプのセキュリティを強制するためにタイプスクリプトインターフェイスを動的に生成します。

    マッピングに従ってオブジェクトを確認するために、yup検証モードを作成します。
  1. オブジェクトの少なくとも1つのキーに有効な妥当性値があることを確認してください(非定義)。
  2. ソリューションのメンテナンスを改善するために、ハードコードキーを避けてください。
  3. ただし、タイプスクリプトはコンピレーション中に静的タイプを実行することを余儀なくされ、YUP処理は実行時に検証されます。
ステップ1:インターフェイスを生成

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.keysreduce

次の課題は、オブジェクトの少なくとも1つのキーが定義された値を持っていることを確認することです。
<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つのキーを確認します。

    結果 以下は、最終モードの動作です。
  1. この例では、Utmsourceは非未定義の値を持つ効果的な鍵であり、Extricileがメタデータの一部ではないため、検証が成功します。

以上がTypeScript でインターフェイスと検証スキーマを動的に生成する (Yup)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。