1つのプロパティの設定を必要とするPartialライクなものを作成する方法
質問
以下のような構造になっています。
export type LinkRestSource = {
model: string;
rel?: string;
title?: string;
} | {
model?: string;
rel: string;
title?: string;
} | {
model?: string;
rel?: string;
title: string;
};
というのとほぼ同じです。
type LinkRestSource = Partial<{model: string, rel: string, title: string}>
ただし、初期型ではプロパティの1つを渡す必要があるのに対し、これは空のオブジェクトを渡すことができます。
のようなジェネリックを作るにはどうしたらよいでしょうか?
Partial
のような、しかし上記の私の構造のように動作するジェネリックを作成するにはどうしたらよいでしょうか?
どのように解決するのですか?
私はあなたのための解決策を持っていると思います。 あなたが探しているものは、型をとる
T
を含む関連した型を生成するものを探しています。
を少なくともひとつ
のプロパティを含む
T
. つまり、次のようなものです。
Partial<T>
と似ていますが、空のオブジェクトを除外しています。
もしそうなら、ここに
type AtLeastOne<T, U = {[K in keyof T]: Pick<T, K> }> = Partial<T> & U[keyof U]
分解してみると:まず
AtLeastOne<T>
は
Partial<T>
と交差している。
何か
.
U[keyof U]
のすべてのプロパティ値の和であることを意味します。
U
. そして、(デフォルト値として)定義した
U
を
マッピングされたタイプ
の各プロパティは
T
にマップされます。
Pick<T, K>
というキーに対応するシングルプロパティタイプの
K
. (例えば
Pick<{foo: string, bar: number},'foo'>
は
{foo: string}
... これは
'foo'
プロパティを元の型から選ぶ) というのは
U[keyof U]
から得られるすべてのシングルプロパティタイプの和であることを意味します。
T
.
うーん、わかりにくいかもしれませんね。 次の具体的な型に対してどのように操作するのか、順を追って見ていきましょう。
type FullLinkRestSource = {
model: string;
rel: string;
title: string;
}
type LinkRestSource = AtLeastOne<FullLinkRestSource>
に展開されます。
type LinkRestSource = AtLeastOne<FullLinkRestSource, {
[K in keyof FullLinkRestSource]: Pick<FullLinkRestSource, K>
}>
または
type LinkRestSource = AtLeastOne<FullLinkRestSource, {
model: Pick<FullLinkRestSource, 'model'>,
rel: Pick<FullLinkRestSource, 'rel'>,
title: Pick<FullLinkRestSource, 'title'>
}>
または
type LinkRestSource = AtLeastOne<FullLinkRestSource, {
model: {model: string},
rel: {rel: string},
title: {title: string}>
}>
または
type LinkRestSource = Partial<FullLinkRestSource> & {
model: {model: string},
rel: {rel: string},
title: {title: string}>
}[keyof {
model: {model: string},
rel: {rel: string},
title: {title: string}>
}]
または
type LinkRestSource = Partial<FullLinkRestSource> & {
model: {model: string},
rel: {rel: string},
title: {title: string}>
}['model' | 'rel' | 'title']
または
type LinkRestSource = Partial<FullLinkRestSource> &
({model: string} | {rel: string} | {title: string})
または
type LinkRestSource = {model?: string, rel?: string, title?: string} &
({model: string} | {rel: string} | {title: string})
または
type LinkRestSource = { model: string, rel?: string, title?: string }
| {model?: string, rel: string, title?: string}
| {model?: string, rel?: string, title: string}
というのは、あなたが望んでいることだと思います。
試してみるといい。
const okay0: LinkRestSource = { model: 'a', rel: 'b', title: 'c' }
const okay1: LinkRestSource = { model: 'a', rel: 'b' }
const okay2: LinkRestSource = { model: 'a' }
const okay3: LinkRestSource = { rel: 'b' }
const okay4: LinkRestSource = { title: 'c' }
const error0: LinkRestSource = {} // missing property
const error1: LinkRestSource = { model: 'a', titel: 'c' } // excess property on string literal
さて、これでうまくいきましたか? がんばってください。
関連
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] Javaで汎用配列を作成する方法は?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] GsonでList<T>オブジェクトをデシリアライズする?
-
[解決済み] タイプスクリプトのレコードタイプとは何ですか?
-
[解決済み] C#で演算子==はジェネリック型に適用できない?
-
[解決済み】汎用型変換FROM文字列
-
[解決済み] なぜJavaのenumリテラルは汎用型パラメータを持つことができないのですか?
-
[解決済み] 汎用型が文字列かどうかをテストする最良の方法?(C#)
-
[解決済み] TypeScriptとIterator。IterableIterator<T> 型は配列型ではありません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] typescript インターフェースは、次の2つのプロパティのうちどちらかが存在する必要があります。
-
[解決済み] TypeScriptでObject.keysがkeyof型を返さないのはなぜですか?
-
[解決済み] Visual Studio コード自動インポート
-
[解決済み] Angular 2で相対パスが非常に長いインポートを回避する方法とは?
-
[解決済み] TypeScriptで純粋な抽象クラスを拡張する場合と実装する場合
-
[解決済み] オプションのパラメータが提供されたかどうかを確認するにはどうすればよいですか?
-
[解決済み] Promise.all()をTypescriptで使用する方法
-
[解決済み] Typescript、"Object is possibly null" エラーをどのように渡すか?
-
同じ型を持つ複数のTypeScript変数を宣言する
-
Array<string>とstring[]の違いは何ですか?