オプションと未定義: オプションのプロパティを確認する方法

WBOY
リリース: 2024-07-28 02:36:43
オリジナル
634 人が閲覧しました

Optional vs. Undefined: How To Check for Optional Properties

TypeScript では、プロパティがオブジェクトから省略できる場合、つまり未定義またはまったく提供されないプロパティはオプションとみなされます。オプションのプロパティは、? を使用して示されます。プロパティキーのサフィックス。プロパティがオプションであるか、またはタイプとして unknown を使用して明示的に定義されているかを判断するのは非常に難しい場合があります。

5 つの可能な組み合わせを含む次の例を考えてみましょう:

type Example = {
    required: number;
    optional?: number;
    requiredAsUndefined: undefined;
    requiredWithUndefined: number | undefined;
    optionalWithUndefined?: number | undefined;
}
ログイン後にコピー

最後の 4 つのプロパティは未定義にすることができますが、実際にオプションであるのは 2 番目と 5 番目だけです。興味深いことに、optional プロパティ、requiredWithUnknown プロパティ、およびoptionalWithUnknown プロパティはすべて同じ共用体型番号に解決されます。未定義。

つまり、私たちが必要とするのは、optional とoptionalWithUnknown に対して true を返し、残りに対して false を返す型です。このようなユーティリティ タイプは次のようになります:

type IsOptional<T, K extends keyof T> = undefined extends T[K]
    ? ({} extends Pick<T, K> ? true : false)
    : false;

type Required = IsOptional<Example, 'required'>;  // false
type Optional = IsOptional<Example, 'optional'>;  // true
type RequiredAsUndefined = IsOptional<Example, 'requiredAsUndefined'>;  // false
type RequiredWithUndefined = IsOptional<Example, 'requiredWithUndefined'>;  // false
type OptionalWithUndefined = IsOptional<Example, 'optionalWithUndefined'>;  // true
ログイン後にコピー

このユーティリティ タイプには 2 つの制約があります。最初の制約である unknown extends T[K] は、unknown が T[K] によってアクセスされる型の一部であることができるかどうかをチェックします。これは基本的に、型 T[K] に未定義を含めることができるかどうかを尋ねます。 2 番目の制約 {} は、Pick を拡張します。 ? true : false、型 {} (空のオブジェクト) がプロパティ K が選択された型に割り当て可能であることを保証します。これは、プロパティがオプションであることを意味します。

このユーティリティ タイプから、オプションのプロパティのみを選択する新しいマップされたタイプを構築できます。オプション以外のプロパティは none に設定されます:

type OptionalProperties<T> = {
    [K in keyof T]: IsOptional<T, K> extends true 
        ? T[K] 
        : never
}

type OnlyOptionals = OptionalProperties<Example>;
// type OnlyOptionals = {
//     required: never;
//     optional?: number;
//     requiredAsUndefined: never;
//     requiredWithUndefined: never;
//     optionalWithUndefined?: number | undefined;
// }
ログイン後にコピー

通常、型安全性を確保するには、type none をプロパティに指定するだけで十分ですが、スタイル上の目的でこれらのプロパティを本当に省略したい場合は、IsOptional を移動することができます。 true 制約を角括弧内に拡張します。これは、オプションではないプロパティのキーを Never に設定し、TypeScript によって自動的に省略されるため、ちょっとした便利なトリックです。

type OnlyOptionals<T> = {
    [K in keyof T as IsOptional<T, K> extends true ? K : never]: T[K]
} 
type OnlyOptionals = OnlyOptionals<Example>;
// type OnlyOptionals = {
//    optional?: number;
//    optionalWithUndefined?: number | undefined;
// }
ログイン後にコピー

ブラウザで直接試すためのプレイグラウンドは次のとおりです: TypeScript Playground

以上がオプションと未定義: オプションのプロパティを確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!