素の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両方の型に対応していたのでとくに問題が出なかったようだ
まとめ
引数の有無や型によって返り値の型もコントロールが可能ということで使える場面はそれなりにあるのかな
覚えておこうと思いました