【JavaScript】String と toString の違い
2021-03-03
文字列の変換は基本的に toString を使うようにしましょう。
String は想定外の値を返すことがあります。
今の現場において、以下のようなコードを見つけました。
const hoge: number | undefined = 0;
const fuga = String(hoge);
console.log(fuga);
ぱっと見めちゃめちゃ微妙なコードですが、JavaScript 的にも TypeScript 的にも何も問題ありません。
今回のケースでは hoge に 0 が格納されているため fuga には "0" が格納されます。
が、例えば以下のようなケースを考えてみると。
const hoge: number | undefined = undefined;
const fuga = String(hoge);
console.log(fuga);
こちらも JavaScript 的にも TypeScript 的にも何も問題ありません。
この場合 fuga には "undefined" が、つまり undefined という文字列が格納されてしまします。
で、この実装をした方は fuga に "undefined" という文字列を格納したかったわけではなかったようです。
恐らく hoge に undefined が格納されているケースに対応しきれず String を使って実装したようでした。
そのため、以下のように書けばひとまず問題は回避できるのですが。
const hoge: number | undefined = undefined;
if (typeof hoge === "number") {
const fuga = String(hoge);
console.log(fuga);
} else {
// hoge に undefined が格納されている場合の処理を書く
}
そもそもなぜ元のような記述が可能でかつ通ってしまうのかと言いますと、String クラスのコンストラクターの引数の型が any なのが色々とアレです。
そのためそもそも String を使用せず toString を使用したほうが安全ということですね。
const hoge: number | undefined = undefined;
// hoge が undefined を許容しているため、型エラーが発生する
const fuga = hoge.toString();
console.log(fuga);
ということで、以下のように書くのがベターかなーと思います。
const hoge: number | undefined = undefined;
if (typeof hoge === "number") {
const fuga = hoge.toString();
console.log(fuga);
} else {
// hoge に undefined が格納されている場合の処理を書く
}