バージョン情報
- rails-ujs 5.2.4
- typescript 3.7.5
本題
strictモードのtypescriptは、初心者にとってはハマり所が多いですね。
さて、CSRFトークンを読み込もうとして、rails-ujsをこうやってimportした。
import {csrfToken} from 'rails-ujs'
axios.defaults.headers.common['X-CSRF-TOKEN'] = csrfToken()
そしたら、次のエラーが発生した。
TS7016: Could not find a declaration file for module 'rails-ujs'. '/project/node_modules/rails-ujs/lib/assets/compiled/rails-ujs.js' implicitly has an 'any' type.
困る。困っているので「typescript 未対応 モジュール」でググると、そのものズバリな記事が出てきた。神か。
TypeScript未対応のモジュールをimportするときのエラー対策
今回、型は割とどうでもいい部分なので、rails-ujsに関してはこのエラーは無視する方向にしたい。
かといって@ts-ignore
を書く方法だと、ファイル毎に毎回毎回書かなきゃいけない可能性があるので、d.tsで回避する方法にした。
app/javascripts/rails.d.ts
を用意して、その中に次の内容を書く。
declare module "rails-ujs";
これでエラーは出なくなりました。
・・そもそも、JS側でのcsrfトークン取得は、実際の実装としてはmetaタグから読み取るだけだし、rails-ujsに頼る必要もないかもね。。。