前提
Typescriptで正しい型のサジェストを出してもらえなくて悩んでいます。
関数の引数に関数のオブジェクトを渡し、そのオブジェクトの関数それぞれの引数に型のサジェストをして欲しいです。
ソースコード
index.ts
1const fn = <Keys extends string, Arg>(fnObj: { 2 [key in Keys]: (arg: Arg) => void; 3}) => { 4 const obj = {}; 5 Object.keys(fnObj).forEach((key) => { 6 obj[key] = fnObj[key]; 7 }); 8 return obj as { [key in Keys]: (arg: Arg) => void }; 9}; 10 11const newObj = fn({ 12 hoge: (arg: { num: number; str: string }) => { 13 //do something 14 }, 15 fuga: (arg: "abc") => { 16 //do something 17 } 18});
現状
index.ts
1newObj.hoge(); 2//正しいサジェストがでる 3//(property) hoge: (arg: { 4// num: number; 5// str: string; 6//}) => void 7 8newObj.fuga(); 9//hogeのargのサジェストがでてしまう 10//(property) fuga: (arg: { 11// num: number; 12// str: string; 13//}) => void
理想
index.ts
1newObj.hoge(); 2//(property) hoge: (arg: { 3// num: number; 4// str: string; 5//}) => void 6 7newObj.fuga(); 8//(property) fuga: (arg: "abc") => void
試したこと
ジェネリクスを変えてみたり色々と試してはみましたが、どれもうまくいきませんでした。
index.ts
1const fn = <Keys extends string, Args extends Record<Keys, any>>(fnObj: { 2 [key in Keys]: (arg: Args[key]) => void; 3}) => { 4 const obj = {}; 5 Object.keys(fnObj).forEach((key) => { 6 obj[key] = fnObj[key]; 7 }); 8 return obj as { [key in Keys]: (arg: Args[key]) => void }; 9}; 10 11//~~~ 12 13newObj.hoge(); 14//(property) hoge: (arg: any) => void
補足情報(FW/ツールのバージョンなど)
Editor : VSCode
package.json
1"typescript": "^4.8.2",
なにかアドバイスいただけるとありがたいです。
ご回答お待ちしております。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。