🥺

TypeScriptにBoolean.prototype.toString()がないので自前で型定義する

2022/12/31に公開約1,600字

地味に困ったので、同じように困っている方もいるんじゃないかと思い記事にしておきます。

前提

JavaScriptには Boolean.prototype.toString() メソッドが存在しています。
Boolean、つまり true, false の値をそれぞれ "true", "false"の文字列に変換することができます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Boolean/toString

使用例
true.toString(); // "true"
("a" === "b").toString(); // "false"

困った

VSCode上でTypeScriptファイルを開き true. まで入力してみると、次の入力候補としてvalueOfが表示されますが、toStringは表示されません 🤔

VSCodeで true. まで入力した画面のスクリーンショット。候補としてvalueOfが表示されているが、toStringは表示されていない。

補完が出ないので仕方なく手打ちしてみると、 Object.toString() 扱い、つまりBooleanに定義されているものではなく遡って使用していることになっています 🤔🤔

VSCodeで true.toString() の toString をホバーした様子のスクリーンショット。Object.toString() と表示されている。

それもそのはず、TypeScriptには Boolean.prototype.toString()が定義されていないのである!!!!

https://github.com/microsoft/TypeScript/blob/747172e6493cb2c70e77c21ed4eb87592dd9bcdb/src/lib/es5.d.ts#L511-L516

なお、型定義がないだけなので、使用ができないわけではありません。
明らかにTSの定義漏れで、2020年にIssueもPRも立てられているのですが、なぜか未だに修正されていません。

https://github.com/microsoft/TypeScript/issues/38347

対応

各自でできる対応として、型定義ファイル (.d.ts) に以下を追加して対応しました。
これで補完が効くようになります。

global.d.ts
export {};

declare global {
  interface Boolean {
    toString(): string;
  }
}

もしくは、仕様上返り値が "true" または "false" になることが定義されているため、"true" | "false" で定義しても良さそうです。

global.d.ts
export {};

declare global {
  interface Boolean {
    toString(): "true" | "false";
  }
}

解決はしましたが、TS側で修正されてほしいものです 🥺

GitHubで編集を提案

Discussion

ログインするとコメントできます