Chainable型
定義
tstype 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}
とすることで、実現できる