notebook

都内でWEB系エンジニアやってます。

TypeScript化時に遭遇したコンパイルエラーその1

素のJavaScriptで書いてたコードをTypeScript化させていたときに遭遇したコンパイルエラー

続くかわからないが後で思い出すように残しておく

buffer' is not assignable to parameter of type 'string'

書いていたコードは下記

import * as fs from 'fs';
const json = JSON.parse(fs.readFileSync('hoge.json'));

単純に型定義追ってけばすぐわかるといえばわかる

サクサク行くと思っていたところで止められたためちょっとイラッとしてとりあえずググるという愚行に出てしまった

すると下記が参考になった

returned value from fs.readFileSync(...) can not be passed into JSON.parse · Issue #186 · nodejs/node-v0.x-archive

github.com

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.parsestring型を必要としているので今回コンパイルエラーとなったようだった

ということで

  • 修正後
import * as fs from 'fs';
const json = JSON.parse(fs.readFileSync('hoge.json', 'utf8'));

とすることで解決

他にもS3のputなどでreadFileSyncを使っている箇所があったがそこはBuffer, string両方の型に対応していたのでとくに問題が出なかったようだ

まとめ

引数の有無や型によって返り値の型もコントロールが可能ということで使える場面はそれなりにあるのかな

覚えておこうと思いました