Chainable型
定義
code:ts
type Chainable<R = {}> = {
option<K extends string, V>(
key: K,
value: 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}とすることで、実現できる