素のJavaScriptで書いてたコードをTypeScript化させていたときに遭遇したコンパイルエラー
続くかわからないが後で思い出すように残しておく
buffer' is not assignable to parameter of type 'string'
書いていたコードは下記
import * as fs from 'fs'; const json = JSON.parse(fs.readFileSync('hoge.json'));
単純に型定義追ってけばすぐわかるといえばわかる
サクサク行くと思っていたところで止められたためちょっとイラッとしてとりあえずググるという愚行に出てしまった
すると下記が参考になった
readFileSync
の第2引数にencoding
のオプションに該当するutf8
を渡してあげれば良いらしい
型定義を覗きに行くと
fs.readFileSync('hoge.json', 'utf8')
のとき
function readFileSync(path: PathLike | number, options: { encoding: string; flag?: string; } | string): string;
fs.readFileSync('hoge.json')
のとき
function readFileSync(path: PathLike | number, options?: { encoding?: null; flag?: string; } | null): Buffer;
実装によって読み込まれる型定義が変わる
JSON.parse
はstring
型を必要としているので今回コンパイルエラーとなったようだった
ということで
- 修正後
import * as fs from 'fs'; const json = JSON.parse(fs.readFileSync('hoge.json', 'utf8'));
とすることで解決
他にもS3のputなどでreadFileSync
を使っている箇所があったがそこはBuffer
, string
両方の型に対応していたのでとくに問題が出なかったようだ
まとめ
引数の有無や型によって返り値の型もコントロールが可能ということで使える場面はそれなりにあるのかな
覚えておこうと思いました