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
このユーティリティ タイプから、オプションのプロパティのみを選択する新しいマップされたタイプを構築できます。オプション以外のプロパティは 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
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 サイトの他の関連記事を参照してください。