generated at
Chainable型
type-challengesの中級の問題 ref



定義
ts
type Chainable<R = {}> = { option<K extends string, V>( key: K, value: V ): Chainable<R & { [key in K]: V }>; get(): R; };

考え方
optionの連鎖と、getで値を共有しないといけないということはgenericsが必須
また、 option の返り値は Chainable でないと連鎖はできない
型引数を与えずにGenericsするにはどうしたらいいか?
初期値を与えればいい
optionを実行するごとに、畳み込んでいく感じなので
初期値として {}
返り値として、 Chainable<R & {...}> と書けばいいということがわかる
getはその結果を返せばいいので簡単
残る問題は、 {...} の部分をどう書くか
V の方が簡単で、genericsにすればいい
K の方は、引数で取ったstringをそのままrecordのkeyにしたい
ただ option(key: string) => { [key in typeof key]: V} のように書いても上手く行かない
そこで、 K extends string の型制約をつけつつ、
{[key in K]: V} とすることで、実現できる