前提・実現したいこと
お問い合わせフォームの入力値から、フォームデータを作成する関数に与える引数の型が分からないので、解決のためにご助力いただきたく存じます。
下記がそのコードです。
typescript
1const data = { "form-name": "contact", name, eMail, message }; 2const encode = (data: any) => { 3 const formData = new FormData(); 4 Object.keys(data).forEach((key) => formData.append(key, data[key])); 5 return formData 6};
現状は引数dataにany型を付けることでエラーを回避していますが、anyではなくより具体的な型を付与したいと思っています。
IDEはVSCodeを使用しています。
発生している問題・エラーメッセージ
any型を付与しなければ下記のエラーメッセージが表示されます。
パラメーター 'data' の型は暗黙的に 'any' になります。
該当のソースコード
typescript
1const data = { "form-name": "contact", name, eMail, message }; 2const encode = (data: any) => { 3 const formData = new FormData(); 4 Object.keys(data).forEach((key) => formData.append(key, data[key])); 5 return formData 6};
試したこと
VSCodeがdataオブジェクトの型を下記のように推論してくれました。
typescript
1const data: { 2 "form-name": string; 3 name: string; 4 mail: string; 5 message: string; 6}
なのでencode関数の引数dataに上記の型を付与しました。
typescript
1const encode = (data: { 2 "form-name": string; 3 name: string; 4 mail: string; 5 message: string; 6}) => { 7 const formData = new FormData(); 8 Object.keys(data).forEach((key) => formData.append(key, data[key])); 9 return formData 10};
すると引数dataに対するエラーは非表示なりましたが、formData.append(key, data[key])
のdata[key]
に対して下記のエラーメッセージが表示されました。
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ "form-name": string; name: string; mail: string; message: string; }'. No index signature with a parameter of type 'string' was found on type '{ "form-name": string; name: string; mail: string; message: string; }'.ts(7053)
みらい翻訳の翻訳を元に翻訳すると下記の通りです。
型'string'の式は型'{ "form-name": 'string'; name: 'string'; mail: 'string'; message: 'string'; }'のインデックスに使用できないため、要素には暗黙的に'any'型があります。 型'{ "form-name": 'string'; name: 'string'; mail: 'string'; message: 'string'; }'に型'string'のパラメータを持つインデックスシグネチャが見つかりませんでした。ts(7053)
formData.apeend()の第一引数はプロパティのキー、第二引数がその値のようなので、
(FormData.append() - データを追加する | DOMリファレンス)
keyはstring型と言えそうですが、第二引数のdata[key]におけるkeyはstring型ではなくnumber型である必要があるかと思い(そのために上記エラーが表示されると思いました)、forEach()の引数keyにstringとnumberのユニオン型を与えました。
typescript
1Object.keys(data).forEach((key: string | number) => formData.append(key, data[key]));
するとformData.apeend()の第一引数のkeyに下記のエラーが表示されました。
型 'ReactText' の引数を型 'string' のパラメーターに割り当てることはできません。 型 'number' を型 'string' に割り当てることはできません。ts(2345)
また、第二引数のエラーは解決できませんでした。
回答にあたりそのほか必要な情報がありましたら、コメントいただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。