🥺
TypeScriptにBoolean.prototype.toString()がないので自前で型定義する
地味に困ったので、同じように困っている方もいるんじゃないかと思い記事にしておきます。
前提
JavaScriptには Boolean.prototype.toString()
メソッドが存在しています。
Boolean、つまり true
, false
の値をそれぞれ "true"
, "false"
の文字列に変換することができます。
使用例
true.toString(); // "true"
("a" === "b").toString(); // "false"
困った
VSCode上でTypeScriptファイルを開き true.
まで入力してみると、次の入力候補としてvalueOf
が表示されますが、toString
は表示されません 🤔
補完が出ないので仕方なく手打ちしてみると、 Object.toString()
扱い、つまりBooleanに定義されているものではなく遡って使用していることになっています 🤔🤔
それもそのはず、TypeScriptには Boolean.prototype.toString()
が定義されていないのである!!!! (TypeScript 4.9 現在)
なお、型定義がないだけなので、使用ができないわけではありません。
明らかにTSの定義漏れで、2020年にIssueもPRも立てられているのですが、なぜか未だに修正されていません。
対応
各自でできる対応として、型定義ファイル (.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側で修正されてほしいものです 🥺
Discussion
Stringコンストラクタ
String(true)
って、問題がありましたっけ……たしかにそれでもよかったですね……!!