前提・実現したいこと
下記のようなコードがあります。コードを見ていただけると分かると思います。
実装のコード
typescript
1// 親のkeyと子となるkeyを持つhumanオブジェクト 2const human = { 3 age: { 4 young: "若いよ", 5 old: "おっさんだよ", 6 }, 7 type: { 8 cool: "クールだよ", 9 heat: "熱いよ", 10 }, 11} as const 12 13type HumanType = typeof human; 14type HumanParentCategoryType = keyof HumanType; // "age" | "type" 15type HumanChildCategoryType = keyof HumanType["age"] | keyof HumanType["type"]; // "young" | "old" | "cool" | "heat" 16 17// 親のkeyと子となるkeyを指定して値を取得するgetObjValueメソッド if文ばかりになってしまっている。。 18function accessObj( 19 parentCategory: HumanParentCategoryType, 20 childCategory: HumanChildCategoryType 21): string { 22 if (parentCategory === "age") { 23 if (childCategory === "young") { 24 return human[parentCategory][childCategory]; 25 } 26 if (childCategory === "old") { 27 return human[parentCategory][childCategory]; 28 } 29 } 30 if (parentCategory === "type") { 31 if (childCategory === "cool") { 32 return human[parentCategory][childCategory]; 33 } 34 if (childCategory === "heat") { 35 return human[parentCategory][childCategory]; 36 } 37 } 38 return "何一致していないよ"; 39} 40 41getObjValue("age", "old");
問題点
ただこれにはいくつかの問題があります。
- type gurldを使って絞り込みを行なってから各valueまでアクセスをしているのですが、humanのプロパティが増えるとif文が増えてしまう。
- getObjValue("age", "heat")のような誤った取得の仕方をしても防げない。
こちらを解決するためにはGenericsを使って下記のような形で対応をする必要があると思っています。
typescript
1// このようにシンプルにしたい! 2function getValue(obj, key) { 3 return obj[key] 4} 5 6const sample = { 7 name: 'Taro', 8 age: 10 9} 10 11getValue(sample, 'name') // 'Taro'
このような形で対応をしてみてはいるのですが今回のような階層の深くなっているパターンをどのようにしてメソッドとして定義をすればいいのかがまだうまくいっていない状態です。
// 理想がこちら function getValue(obj, parentKey, childKey) { return obj[parentKey][childKey] }
何かいい案がありましたら教えていただけると助かります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/30 07:20