mosya<TC> - オブジェクトにキーとバリューを追加する型を作ろうの解説
この記事はmosya<TC>の問題の一つであるAppendToObject型の解説になります。
問題
インターフェースに新しいフィールドを追加する型を実装します。この型は、3 つの引数を受け取り、新しいフィールドを持つオブジェクトを出力しなければなりません。
例えば、以下のようなコードを満たすように実装しましょう。
type Test = { id: "1" };
type Result = AppendToObject<
Test,
"value",
4
>; // expected to be { id: '1', value: 4 }
解答例
type AppendToObject<
T extends {},
U extends string,
V
> = {
[k in keyof T | U]: k extends keyof T
? T[k]
: V;
};
T extends {}
という条件を指定し、T
がオブジェクト型であることを制約します。U
は、追加するフィールドの名前なので、U extends string
という条件を指定し、U
はstring
型に制約します。V
は、追加するフィールドの値なので、V
はそのまま返すので、制約はありません。[k in keyof T | U]
という型を指定し、T
のフィールドとU
を合わせたフィールドをオブジェクトのフィールドとして指定します。k extends keyof T ? T[k] : V
という条件を指定し、k
がT
のフィールドにある場合は、そのフィールドの値を返し、そうでない場合は、V
を返します。
Authored by
Godai@steelydylan
Webサービスを作るのが好きなWebエンジニア。子供が産まれたことをきっかけに独立し法人化。サービス開発が大好き。
好きな言語はTypeScript。