web-dev-qa-db-ja.com

TypeScriptレコードのオプションキーのリストを定義する

キー 'a'、 'b'、または 'c'のみを持つことができるオブジェクトを入力したい。

だから私は次のようにそれを行うことができます:

Interface IList {
    a?: string;
    b?: string;
    c?: string;
}

それらはすべてオプションです!これはRecordで1行で記述できるかどうか疑問に思っていました

type List = Record<'a' | 'b' | 'c', string>;

唯一の問題は、すべてのキーを定義する必要があることです。だから私は終わった

type List = Partial<Record<'a' | 'b' | 'c', string>>;

これは機能しますが、パーシャルなしでこれを行うより良い方法があると想像できます。 Record内でキーをオプションにする他の方法はありますか?

12

Recordのメンバーのオプションを指定する方法はありません。それらは定義上必要です

type Record<K extends keyof any, T> = {
    [P in K]: T; // Mapped properties are not optional, and it's not a homomorphic mapped type so it can't come from anywhere else.
};

これが一般的なシナリオである場合は、独自のタイプを定義できます。

type PartialRecord<K extends keyof any, T> = {
  [P in K]?: T;
};
type List =  PartialRecord<'a' | 'b' | 'c', string>

または、事前定義されたマップタイプを使用してPartialRecordを定義することもできます。

type PartialRecord<K extends keyof any, T> =  Partial<Record<K, T>>

Listタイプの部分バージョンを作成できます:

type PartialList = Partial<List>;

中間タイプが不要な場合は、1行ですべて実行できます。

type PartialList = Partial<Record<'a' | 'b' | 'c', string>>;

結局のところ、あなたの将来の自己にとって最も表現力のあるものは次のように決めることができます。

type List = {
    a?: string;
    b?: string;
    c?: string;
}
3
Fenton